今日内容

1 开发一个登录app

image-20230711145637658

1
2
3
4
5
# 案例咱们学到的
1 页面布局--》逆向不重要,不关注
2 java操作xml布局---》逆向也不重要
3 java发送http请求到后端---》逆向很重要
4 python编写后端服务:flask--》8期视频

1.0 创建安卓项目

1
2
# 之前讲过,按步骤创建
# 创建完后,在真机运行,能顺利运行,在继续开发

1.1 编写安卓xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="216dp"
android:layout_marginTop="150dp"
android:background="#dddddd"
android:orientation="vertical">

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="用户登录"
android:textAlignment="center"
android:textSize="25dp"></TextView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:orientation="horizontal">
<TextView
android:layout_width="60dp"
android:layout_height="match_parent"
android:gravity="center"
android:text="用户名"></TextView>
<EditText
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/txt_user"></EditText>


</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:orientation="horizontal">
<TextView
android:layout_width="60dp"
android:layout_height="match_parent"
android:gravity="center"
android:text="密码"></TextView>
<EditText
android:layout_width="match_parent"
android:layout_height="match_parent"
android:inputType="textPassword"
android:id="@+id/txt_pwd"></EditText>


</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:gravity="center"
android:orientation="horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="15dp"
android:text="登录"
android:id="@+id/btn_login"></Button>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="重置"
android:id="@+id/btn_reset"></Button>



</LinearLayout>





</LinearLayout>

</LinearLayout>

1.2 安卓java端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package com.justin.s10demo02;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;

public class MainActivity extends AppCompatActivity {
private TextView txtUser, txtPwd;
private Button btnLogin, btnReset;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 1 取到 用户名输入框,密码输入框,登录按钮,重置按钮--》进行操作
initView();
// 2 当点击登录按钮和重置按钮,要进行一些操作
initListener();
}


private void initView() {
//取到 用户名输入框,密码输入框,登录按钮,重置按钮
txtUser = findViewById(R.id.txt_user);
txtPwd = findViewById(R.id.txt_pwd);
btnLogin = findViewById(R.id.btn_login);
btnReset = findViewById(R.id.btn_reset);

}

private void initListener() {
// 给按钮绑定事件
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 写登录功能--》代码会很多--》写到方法中
loginForm();
}
});

btnReset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 清空 两个输入框
txtUser.setText("");
txtPwd.setText("");
}
});
}

private void loginForm() {
// 1 取出填入的用户名密码
String username = String.valueOf(txtUser.getText());
String password = String.valueOf(txtPwd.getText());
Toast t = Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_LONG);
// 2 发送http请求到后端,携带用户名密码---》后端校验通过---》返回数据--->发送网络请求,必须新开一个线程操作
new Thread() {
@Override
public void run() {
// 发送网络请求---》1 安卓要能上网,必须申请权限; 2 发送http请求,需要借助于第三方包(okhttp:安卓上非常常用的) 3 额外配置第三包能发送http请求(默认只能发送https)
// 使用okhttp向咱们写的python后端发送请求---》使用postman,requests模块发送请求了
OkHttpClient client = new OkHttpClient.Builder().build();
FormBody form = new FormBody.Builder().add("username", username).add("password", password).build();
Request req = new Request.Builder().url("http://192.168.71.8:8080/login").post(form).build();
Call call = client.newCall(req); // 真正发送请求
try {
Response res = call.execute();
ResponseBody body = res.body();
String dataString = body.string();
// 弹出吐司
t.show();
Log.e("MainActivity", dataString);
} catch (IOException ex) {
Log.e("MainActivity", "网络请求异常");
}
}
}.start();

}


}

1.3 配置安卓发送http请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 1 引入并下载第三方模块:okhttp---》python中requests可以发送http请求
-okhttp就是安卓上的requests模块,最广泛的模块
-在build.gradle中 implementation "com.squareup.okhttp3:okhttp:4.9.1"
-上面那句话等同于:pip install requests

# 2 配置手机运行发送网络请求:
<uses-permission android:name="android.permission.INTERNET"/>


# 3 使用okhttp默认发送的是https请求,如果要发送http请求,要做额外配置
-https=http+ssl 安全传入
-咱们写的后端,默认没有部署---》只能监听http--》nginx代理,集成证书--》做成https
-3.1 在res/xml 下新建 security.xml 写入以下内容
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
-3.2 在AndroidManifest.xml加入
<application
...
android:networkSecurityConfig="@xml/security"
...>

image-20240517162617350

1.4 Python的flask后端

1
2
3
4
5
6
7
8
9
10
# flask 后端写完了,我们后端要测试
-1 使用requests模块模拟发送请求
-2 postman 接口测试工具,可以模拟发送http请求,等同于python的requests模块,它有图形化界面
-3 使用浏览器?不行,浏览器只能发送get请求,post请求只有浏览器是发送不出来的


# 2 的方案requests模块代码如下
import requests
res=requests.post('http://192.168.71.8:8080/login',data={'username':'justin','password':'12344'})
print(res.text)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
'''
python 界 有几个出名的web框架,用来写web后端
咱们浏览的网站,app,微信小程序。。 后台都是使用web后端写起来的
web后端可能用java,go,python,php
java:ssm,ssh,SpringBoot
go:gin,beego框架
python:django,flask(咱们用-8期视频),fastapi
php:php的框架

咱们的app后端, 现在用 flask写

'''
import uuid

# 第一步:安装flask pip3 install flask 装最新,3.0.0 版本

# 第二步:写代码,只需要几行代码,就能写出一个web后端
# 导入
from flask import Flask, request, jsonify

# 实例化得到对象
app = Flask(__name__)


@app.route('/', methods=['GET'])
def index():
return '我是首页'


@app.route('/login', methods=['POST']) # 给安卓app使用
def login():
# 取出前端[app],携带的用户名和密码,做判断,如果判断通过,返回登录成功,不通过就返回登录失败
username = request.form.get('username')
password = request.form.get('password')
if username == 'justin' and password == '123': # 真正的后端,这里需要查数据库,我们是写死了
# 登录成功,返回给前端登录成功和token
token = str(uuid.uuid4())
return jsonify({'code': 100, 'msg': '登录成功', 'token': token})
else:
return jsonify({'code': 101, 'msg': '用户名或密码错误'})


if __name__ == '__main__':
app.run('0.0.0.0', 8080) # 写了 0.0.0.0 在同一个局域网内,都可以访问---》手机跟电脑在同一个局域网内,可以访问

image-20240517162628848

image-20240517162636430

2 请求加密

1
2
3
# 为了提高app的安全性,咱们通常会在 请求头或请求体中加入 sign签名,app端生成,后端校验,校验通过才继续后续操作


2.1 app端加密

Utils

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.justin.s10demo02;

import java.security.MessageDigest;

public class Utils {
public static String md5(String dataString){
try {
MessageDigest instance = MessageDigest.getInstance("MD5");
byte[] nameBytes = instance.digest(dataString.getBytes());

// 十六进制展示
StringBuilder sb = new StringBuilder();
for (int i = 0; i < nameBytes.length; i++) {
int val = nameBytes[i] & 255;
if (val < 16) {
sb.append("0");
}
sb.append(Integer.toHexString(val));
}
return sb.toString();
} catch (Exception e) {
return null;
}
}
}

MainActivity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

private void loginForm() {
// 1 取出填入的用户名密码
String username = String.valueOf(txtUser.getText());
String password = String.valueOf(txtPwd.getText());
// 把用户名+ 盐---》用md5加密--》当做sign
// 当前时间戳+用户名--》md5加密--》当做sign
String sign = Utils.md5(username + "s10demo02");
Toast t = Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_LONG);
// 2 发送http请求到后端,携带用户名密码---》后端校验通过---》返回数据--->发送网络请求,必须新开一个线程操作
new Thread() {
@Override
public void run() {
// 发送网络请求---》1 安卓要能上网,必须申请权限; 2 发送http请求,需要借助于第三方包(okhttp:安卓上非常常用的) 3 额外配置第三包能发送http请求(默认只能发送https)
// 使用okhttp向咱们写的python后端发送请求---》使用postman,requests模块发送请求了
OkHttpClient client = new OkHttpClient.Builder().build();

// 请求体中加sign签名---》后端校验签名过后通过--》再校验用户名密码
FormBody form = new FormBody.Builder().add("username", username).add("password", password).add("sign", sign).build();
Request req = new Request.Builder().url("http://192.168.71.8:8080/login").post(form).build();
Call call = client.newCall(req); // 真正发送请求
try {
Response res = call.execute();
ResponseBody body = res.body();
String dataString = body.string();
// 弹出吐司
t.show();
Log.e("MainActivity", dataString);
} catch (IOException ex) {
Log.e("MainActivity", "网络请求异常");
}
}
}.start();

}

2.2 后端Python验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

@app.route('/login', methods=['POST']) # 给安卓app使用
def login():
# 取出签名做校验
sign = request.form.get('sign')

# 取出前端[app],携带的用户名和密码,做判断,如果判断通过,返回登录成功,不通过就返回登录失败
username = request.form.get('username')
password = request.form.get('password')
new_sign = get_md5(username + 's10demo02')
if sign == new_sign:
if username == 'justin' and password == '123': # 真正的后端,这里需要查数据库,我们是写死了
# 登录成功,返回给前端登录成功和token
token = str(uuid.uuid4())
return jsonify({'code': 100, 'msg': '登录成功', 'token': token})
else:
return jsonify({'code': 101, 'msg': '用户名或密码错误'})
return jsonify({'code': 101, 'msg': '签名校验失败'})

2.3 再使用爬虫,登录失败了

1
2
3
import requests
res=requests.post('http://192.168.71.8:8080/login',data={'username':'justin','password':'123','sign':'asdfasdf'})
print(res.json())

3 序列化–登录成功显示热播电影案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 前端(安卓app) 和 后端(python-flask) 交互---》通过 json 格式字符串进行通信的
在app端,把后端返回给我们的json格式字符串---》转成java中的对象,这个过程称之为反序列化
在app端,把java对象,转成json格式字符串---》这个过程称之为序列化

#【前端】 之前前端代码这么写的
FormBody form = new FormBody.Builder().add("username", username).add("password", password).add("sign", sign).build();
# 本质是把username password sign---》放到了请求体中---》以字符串形式发送给了后端

# 【后端】取出app端传过来的数据--字符串---》做成字典形式--》从字典中取出值
request.form.get('username')


# 整个过程中,要做序列化和反序列化
-app端:是java代码,借助于第三方模块
-fastjson:阿里工程师开源的,后来被发现又漏洞,几乎不用了
-Google公司,Gson,安卓上大家一般使用这个

-python的flask端: json.loads json.dumps



# 我们要在 app中做序列化和反序列化---》使用第三方的Gson
-1 在build.gradle中注册---》自动下载模块
# implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.google.code.gson:gson:2.10.1'
-2 新建类
-3 序列化
LoginResponse l1 = new LoginResponse(100, "成功拉", "asdfas-asdf-3ed2-aewsdf");
String strL1 = new Gson().toJson(l1);

-4 反序列化
LoginResponse loginResponse = new Gson().fromJson(dataString, LoginResponse.class);
loginResponse.code
loginResponse.msg
loginResponse.toke

3.1 登录成功后,跳转到显示热映电影

image-20240517162653737

1
2
3
4
# 1 登录成功跳转到另一个页面---》
# 2 新建一个安卓页面 IndexActivity.java-->配合一个xml
# 3 新建ListView适配器---》 layout/list_item.xml

image-20240517162711100

image-20240517162718318

3.1.0 MainActivity

1
2
3
// 登录成功,跳转到别的页面
Intent intent = new Intent(MainActivity.this, IndexActivity.class);
startActivity(intent);

3.1.1 IndexActivity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package com.justin.s10demo02;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.google.gson.Gson;
import com.justin.s10demo02.entity.Films;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;

public class IndexActivity extends AppCompatActivity {
private ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_index);
// 取出List
listView = findViewById(R.id.listView);
// 发送网络请求,获取电影数据
new Thread() {
@Override
public void run() {
OkHttpClient client = new OkHttpClient.Builder().build();
Request request = new Request.Builder().url("http://192.168.71.8:8080/film").get().build();//get请求
Call call = client.newCall(request);
try {
Response res = call.execute();
ResponseBody body = res.body();
String dataString = body.string();
Films obj = new Gson().fromJson(dataString, Films.class);
if (obj.code == 100) {
showToast(obj.msg);
// 填充适配器
// 创建自定义适配器并设置给 ListView
// ui更新,不能放在线程中

// 创建ListView的适配器,显示到页面中---》在线程中---》ui更新要切换到ui线程中
runOnUiThread(new Runnable() {
@Override
public void run() {
MyAdapter adapter = new MyAdapter(IndexActivity.this, obj);
listView.setAdapter(adapter);
}
});




}
} catch (IOException e) {
Log.e("asdfas", "发送网络失败");
}
}
}.start();
}

private void showToast(final String message) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(IndexActivity.this, message, Toast.LENGTH_LONG).show();
}
});
}

class MyAdapter extends BaseAdapter {

private Context context;
private Films dataList;

public MyAdapter(Context context, Films dataList) {
this.context = context;
this.dataList = dataList;
}

@Override
public int getCount() {
return dataList.films.size();
}

@Override
public Object getItem(int position) {
return null;
}

@Override
public long getItemId(int position) {
return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
// 根据布局文件实例化view
TextView tv = (TextView) convertView.findViewById(R.id.name);
tv.setText(this.dataList.films.get(position).name);

TextView synopsis = (TextView) convertView.findViewById(R.id.synopsis);
synopsis.setText(this.dataList.films.get(position).synopsis);


ImageView img = (ImageView) convertView.findViewById(R.id.pic);
//使用Glide加载图片
Glide.with(context)
//加载地址
.load(this.dataList.films.get(position).poster)
//加载失败时,设置默认的图片
.placeholder(R.mipmap.ic_launcher)
//显示的位置
.into(img);
return convertView;
}
}
}

3.1.2 activity_index.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".IndexActivity">

<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>

</LinearLayout>

3.1.3 list_item.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ImageView
android:id="@+id/pic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></ImageView>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="电影标题"
android:textColor="#000000"
android:textSize="20dp"></TextView>

<TextView
android:id="@+id/synopsis"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="电影摘要"
android:textColor="#000000"
android:textSize="15dp"></TextView>


</LinearLayout>

</LinearLayout>

3.1.4 配置加载网络图片

1
2
3
4
5
dependencies {   
implementation "com.squareup.okhttp3:okhttp:4.9.1"
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.github.bumptech.glide:glide:4.11.0'
}

3.1.5 编写响应类–》接受后端返回的数据–》反序列化成功java的对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.justin.s10demo02.entity;

import java.util.ArrayList;

public class Films {
public int code;
public String msg;
public ArrayList<FilmsReal> films;

}


package com.justin.s10demo02.entity;

public class FilmsReal {
public String name;
public String poster;
public String synopsis;
}


3.1.6 后端–》返回电影接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
'''
python 界 有几个出名的web框架,用来写web后端
咱们浏览的网站,app,微信小程序。。 后台都是使用web后端写起来的
web后端可能用java,go,python,php
java:ssm,ssh,SpringBoot
go:gin,beego框架
python:django,flask(咱们用-8期视频),fastapi
php:php的框架

咱们的app后端, 现在用 flask写

'''
import json
import uuid

# 第一步:安装flask pip3 install flask 装最新,3.0.0 版本

# 第二步:写代码,只需要几行代码,就能写出一个web后端
# 导入
from flask import Flask, request, jsonify
import hashlib

# 实例化得到对象
app = Flask(__name__)


@app.route('/', methods=['GET'])
def index():
return '我是首页'


def get_md5(data):
md5 = hashlib.md5()
md5.update(data.encode('utf-8'))
return md5.hexdigest()


@app.route('/login', methods=['POST']) # 给安卓app使用
def login():
# 取出签名做校验
sign = request.form.get('sign')

# 取出前端[app],携带的用户名和密码,做判断,如果判断通过,返回登录成功,不通过就返回登录失败
username = request.form.get('username')
password = request.form.get('password')
new_sign = get_md5(username + 's10demo02')
if sign == new_sign:
if username == 'justin' and password == '123': # 真正的后端,这里需要查数据库,我们是写死了
# 登录成功,返回给前端登录成功和token
token = str(uuid.uuid4())
return jsonify({'code': 100, 'msg': '登录成功', 'token': token})
else:
return jsonify({'code': 101, 'msg': '用户名或密码错误!!!'})
return jsonify({'code': 101, 'msg': '签名校验失败'})

@app.route('/film',methods=['GET'])
def film():
with open('./film.json','rt',encoding='utf-8') as f:
dic=json.load(f)

return jsonify(dic)

if __name__ == '__main__':
app.run('0.0.0.0', 8080) # 写了 0.0.0.0 在同一个局域网内,都可以访问---》手机跟电脑在同一个局域网内,可以访问

3.1.7 film.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
{
"code": 100,
"films": [
{
"filmId": 6660,
"name": "三大队",
"poster": "https://pic.maizuo.com/usr/movie/88ea8dff563db98b06efcfc07acf5283.jpg",
"actors": [
{
"name": "戴墨",
"role": "导演",
"avatarAddress": "https://pic.maizuo.com/usr/movie/7d35c5ad443c64db177b335dc52d8726.jpg"
},
{
"name": "张译",
"role": " 程兵",
"avatarAddress": "https://pic.maizuo.com/usr/movie/ff9aafa8c6033a1277d5ecd65822f8ae.jpg"
},
{
"name": "李晨",
"role": "演员",
"avatarAddress": "https://pic.maizuo.com/usr/movie/ed4778a23fdcb6bab9c5a6e6e333f92f.jpg"
},
{
"name": "魏晨",
"role": "演员",
"avatarAddress": "https://pic.maizuo.com/usr/movie/2f21cf0e9f19dd93c25a53252e149b81.png"
},
{
"name": "曹炳琨",
"role": "演员",
"avatarAddress": "https://pic.maizuo.com/usr/movie/4ebf2d26239818c2fe24f530587aaad8.jpg"
}
],
"director": "戴墨",
"category": "剧情|犯罪",
"synopsis": "电影《三大队》根据真实事件改编,原载于“网易人间工作室”,原作名为《请转告局长,三大队任务完成了》(作者深蓝)。刑侦大队队长程兵(张译 饰)带领的三大队在办理一起恶性案件的过程中导致嫌犯之一意外死亡,被判入狱。出狱后依然坚持以普通人身份追踪在逃嫌犯的故事。",
"filmType": {
"name": "4D",
"value": 13
},
"nation": "中国大陆",
"language": "",
"videoId": "",
"premiereAt": 1702598400,
"timeType": 3,
"runtime": 132,
"item": {
"name": "4D",
"type": 13
},
"isPresale": true,
"isSale": false
},
{
"filmId": 6643,
"name": "瞒天过海",
"poster": "https://pic.maizuo.com/usr/movie/e2cca01d8be2935a99b73a139f6e7a6a.jpg",
"actors": [
{
"name": "陈卓",
"role": "导演",
"avatarAddress": "https://pic.maizuo.com/usr/movie/d601021be0f62f1f70a5eb47190ee79a.jpg"
},
{
"name": "惠英红",
"role": "虹姐",
"avatarAddress": "https://pic.maizuo.com/usr/movie/9b4e98a6dec2523218b7c9308fe83e22.jpg"
},
{
"name": "尹正",
"role": "明浩",
"avatarAddress": "https://pic.maizuo.com/usr/movie/6ed7d96c8723a3272202283876622d28.jpg"
},
{
"name": "许光汉",
"role": "郑威",
"avatarAddress": "https://pic.maizuo.com/usr/movie/6d1d805de361b777d0910f9646df2f24.jpg"
},
{
"name": "张钧甯",
"role": "乔文娜",
"avatarAddress": "https://pic.maizuo.com/usr/movie/57970a3dd17cca49a87a9ea653aeffaf.jpg"
}
],
"director": "陈卓",
"category": "剧情|悬疑|犯罪",
"synopsis": "受冤平民,怒杀疯批!岁末悬疑大戏,即将高能开局! 贪婪无厌的警长郑威(许光汉 饰)得知富商之妻乔文娜(张钧甯 饰)蒙冤卷入一场密室谋杀案后主动登门交易,索要巨额钱财帮她洗脱罪名。随着交易展开,竟意外牵连出另一起凶杀案,丈夫失踪的虹姐(惠英红 饰)自曝被强权欺压,走投无路的她向杀害丈夫的议员之子明浩(尹正 饰)绝望复仇…… 案中有案,局中有局,钱权交易与势力压迫之下被掩盖的真相到底是什么?",
"filmType": {
"name": "2D",
"value": 1
},
"nation": "中国大陆",
"language": "",
"videoId": "",
"premiereAt": 1701993600,
"timeType": 3,
"runtime": 106,
"grade": "7.9",
"item": {
"name": "2D",
"type": 1
},
"isPresale": true,
"isSale": false
},
{
"filmId": 6654,
"name": "爆裂点",
"poster": "https://pic.maizuo.com/usr/movie/4dd8a45785615d193056767df008cd64.jpg",
"actors": [
{
"name": "林超贤",
"role": "导演",
"avatarAddress": "https://pic.maizuo.com/usr/movie/39df43112a97a7e820908ed0c9224724.jpg"
},
{
"name": "张家辉",
"role": "演员",
"avatarAddress": "https://pic.maizuo.com/usr/movie/fc8a03ec7584efd458f3b6c0db4ecd50.jpg"
},
{
"name": "陈伟霆",
"role": "演员",
"avatarAddress": "https://pic.maizuo.com/usr/movie/3406b1e450ff0deb1671e2b9a0538e49.jpg"
},
{
"name": "梁洛施",
"role": "演员",
"avatarAddress": "https://pic.maizuo.com/usr/movie/e6e0edb4cdd1d3d9b2f99567738bbf65.jpg"
},
{
"name": "谭俊彦",
"role": "演员",
"avatarAddress": "https://pic.maizuo.com/usr/movie/165dce84a54de72148492307d344fb75.jpg"
}
],
"director": "林超贤|唐唯瀚",
"category": "动作|警匪",
"synopsis": "缉毒总督察李志行派遣卧底探员江铭潜入贩毒组织,誓将毒首韩洋抓捕。未料江铭却为势所迫步向黑暗,李志行竭力挽救不果,师徒更成敌对关系,不可挽回…",
"filmType": {
"name": "4D",
"value": 13
},
"nation": "中国香港,中国大陆",
"language": "",
"videoId": "",
"premiereAt": 1701993600,
"timeType": 3,
"runtime": 138,
"grade": "7.9",
"item": {
"name": "4D",
"type": 13
},
"isPresale": true,
"isSale": false
},
{
"filmId": 6637,
"name": "照明商店",
"poster": "https://pic.maizuo.com/usr/movie/4950166f50fbf0428115e5ffb01d9ed5.jpg",
"actors": [
{
"name": "蔡婧",
"role": "导演",
"avatarAddress": "https://pic.maizuo.com/usr/movie/4dfecb1e7861a036090fb854964fa371.jpg"
},
{
"name": "章若楠",
"role": " 许念",
"avatarAddress": "https://pic.maizuo.com/usr/movie/98e1f0c6bcf9076de5594b77e688db4f.jpg"
},
{
"name": "白宇帆",
"role": " 郑满",
"avatarAddress": "https://pic.maizuo.com/usr/movie/e5af773bbba4e924c022de5cc58957e3.jpg"
},
{
"name": "刘奕君",
"role": " 老板",
"avatarAddress": "https://pic.maizuo.com/usr/movie/888c924db559e525b3275d319ca50482.jpg"
},
{
"name": "黄澄澄",
"role": "演员",
"avatarAddress": "https://pic.maizuo.com/usr/movie/5933905a2f3b1e96ea37f10964b01f89.jpg"
}
],
"director": "蔡婧",
"category": "剧情",
"synopsis": "深巷的尽头,一间“照明商店”长年亮着灯,神秘的老板(刘奕君 饰)细心擦拭着每一个灯泡,形形色色的客人络绎不绝。护士许念(章若楠 饰)和男友郑满(白宇帆 饰)新搬进了商店附近的公寓。她渐渐发现,这里的每一个人,心底都有一个不可言说的秘密。暴风雨之夜,她走进了巷尾的照明商店,答案渐渐被揭开……",
"filmType": {
"name": "2D",
"value": 1
},
"nation": "中国大陆",
"language": "",
"videoId": "",
"premiereAt": 1702598400,
"timeType": 3,
"runtime": 99,
"item": {
"name": "2D",
"type": 1
},
"isPresale": true,
"isSale": false
},
{
"filmId": 6666,
"name": "一闪一闪亮星星",
"poster": "https://pic.maizuo.com/usr/movie/b5ef931e6d7f3419dbc2e196afaf1fc7.jpg",
"actors": [
{
"name": "陈小明",
"role": "导演",
"avatarAddress": "https://pic.maizuo.com/usr/movie/1344414485c7f694a815c16f305bd234.jpg"
},
{
"name": "章攀",
"role": "导演",
"avatarAddress": "https://pic.maizuo.com/usr/movie/36f40652ea04bb77dc1cddfb33ff5b72.jpg"
},
{
"name": "屈楚萧",
"role": "张万森",
"avatarAddress": "https://pic.maizuo.com/usr/movie/4b52f56805599eafcdb33e84ff8b1d17.jpg"
},
{
"name": "张佳宁",
"role": "林北星",
"avatarAddress": "https://pic.maizuo.com/usr/movie/4c04863d11d0d5eadb31ed9517b8f4b7.jpg"
},
{
"name": "傅菁",
"role": "高歌",
"avatarAddress": "https://pic.maizuo.com/usr/movie/987deda7f7f3b9f5a7f5f4c3dfe380dd.jpg"
}
],
"director": "陈小明|章攀",
"category": "爱情|奇幻",
"synopsis": "现象级爆款剧集同名电影《一闪一闪亮星星》,原班人马再续纯爱故事,令无数观众翘首以盼的纯爱时空再启,奔赴甜虐暗恋!张万森(屈楚萧 饰)计划在高考后向暗恋已久的女生林北星(张佳宁 饰) 表白,突如其来的演唱会事故却让一切变成了一场无可挽回的悲剧,没想到的是,痛苦无助的张万森竟意外重启了这个夏天,再次回到悲剧发生前的林北星身边,而重启夏天的秘密,仿佛没有想象中那么简单……这一次,拼尽全力的张万森能否成功守护林北星,让所有刻骨铭心的遗憾都得以圆满?星河流转中的某个瞬间,青春里的那场绵绵大雪,能不能落在相爱的两人身上?",
"filmType": {
"name": "4D",
"value": 13
},
"nation": "中国大陆",
"language": "",
"videoId": "",
"premiereAt": 1703894400,
"timeType": 3,
"runtime": 107,
"item": {
"name": "4D",
"type": 13
},
"isPresale": true,
"isSale": false
},
{
"filmId": 6665,
"name": "名侦探柯南:黑铁的鱼影",
"poster": "https://pic.maizuo.com/usr/movie/82f386e073e65e40007461f4c8907207.jpg",
"actors": [
{
"name": "立川让",
"role": "导演",
"avatarAddress": "https://pic.maizuo.com/usr/movie/86b0cff438d55e4e01ca8c44fae64686.jpg"
},
{
"name": "高山南",
"role": "江户川柯南",
"avatarAddress": "https://pic.maizuo.com/usr/movie/ef58c1fa37cef5adc1f297f693c29938.jpg"
},
{
"name": "山崎和佳奈",
"role": "毛利兰",
"avatarAddress": "https://pic.maizuo.com/usr/movie/e06ed1218db91f5ca9b1c8ab014d70e4.jpg"
},
{
"name": "小山力也",
"role": "毛利小五郎",
"avatarAddress": "https://pic.maizuo.com/usr/movie/b5cb1cf254796dfb7e8f92c4a39aa795.jpg"
},
{
"name": "林原惠美",
"role": "灰原哀",
"avatarAddress": "https://pic.maizuo.com/usr/movie/4c475c708202252842ee9110ba826065.jpg"
}
],
"director": "立川让",
"category": "动画|悬疑|动作",
"synopsis": "这次的故事发生在东京八丈岛近海,一座将全球各地警方监控相连接的高科技设施——“太平洋浮标”即将启动。为了与欧洲刑警组织管辖的范围联网,来自世界各地的工程师聚集在这里。基于人脸识别的全新“黑科技”也正在测试中…与此同时,柯南一行人前往八丈岛观鲸,途中柯南接到冲矢昴(赤井秀一)的电话,被告知欧洲刑警组织成员在德国遭到琴酒的杀害。为调查真相的柯南潜入“太平洋浮标”。正当工程师们正在为系统启动而展开准备工作时,一桩案件突然发生!一名女工程师被黑暗组织绑架,她手中存有核心技术的U盘也落入了黑暗组织手中!此时,水下传来未知潜水艇逼近的声音,令人毛骨悚然,一个神秘的黑影也正在悄悄接近灰原哀…",
"filmType": {
"name": "2D",
"value": 1
},
"nation": "日本",
"language": "",
"videoId": "",
"premiereAt": 1702684800,
"timeType": 3,
"runtime": 110,
"item": {
"name": "2D",
"type": 1
},
"isPresale": true,
"isSale": false
},
{
"filmId": 6662,
"name": "旺卡",
"poster": "https://pic.maizuo.com/usr/movie/2432cf22b190f32b372fb586fa79e294.jpg",
"actors": [
{
"name": "保罗·金",
"role": "导演",
"avatarAddress": "https://pic.maizuo.com/usr/movie/6262506bf5f0de5e7d8849dddae6cb86.jpg"
},
{
"name": "提莫西·查拉梅",
"role": "威利·旺卡",
"avatarAddress": "https://pic.maizuo.com/usr/movie/5697b464e40ed22bec1a9e1952d3adb9.jpg"
},
{
"name": "奥莉薇娅·柯尔曼",
"role": "斯卡碧夫人",
"avatarAddress": "https://pic.maizuo.com/usr/movie/2016d743d0fcd90bc154056fcdbdd110.jpg"
},
{
"name": "休·格兰特",
"role": "奥帕伦帕人",
"avatarAddress": "https://pic.maizuo.com/usr/movie/e54904487b1d782de59fca889c1003ab.jpg"
},
{
"name": "罗温·艾金森",
"role": "朱利叶斯神父",
"avatarAddress": "https://pic.maizuo.com/usr/movie/470ae1d1e01d9473c190b5b603923feb.jpg"
}
],
"director": "保罗·金",
"category": "喜剧|歌舞|奇幻|冒险",
"synopsis": "今年冬天最甜最好吃的电影来了!《哈利·波特》《帕丁顿熊》系列金牌班底打造,《旺卡》聚焦经典之作《查理和巧克力工厂》的主人公,由“甜茶”提莫西·查拉梅饰演的威利·旺卡,这位年轻且天赋异禀的发明家、魔术师、巧克力制作师,是如何经历奇幻冒险,成长为观众挚爱的巧克力工厂掌门人的故事。这世间的所有美好事物,都始于一个梦想!而如果你有幸遇见旺卡,那么一切皆有可能!",
"filmType": {
"name": "2D",
"value": 1
},
"nation": "美国,爱尔兰,法国,加拿大,澳大利亚,英国",
"language": "",
"videoId": "",
"premiereAt": 1701993600,
"timeType": 3,
"runtime": 117,
"grade": "7.5",
"item": {
"name": "2D",
"type": 1
},
"isPresale": true,
"isSale": false
},
{
"filmId": 6618,
"name": "涉过愤怒的海",
"poster": "https://pic.maizuo.com/usr/movie/2f2566dffd5955d0b960a9ac8946e59c.jpg",
"actors": [
{
"name": "曹保平",
"role": "导演",
"avatarAddress": "https://pic.maizuo.com/usr/movie/b32e9eb0948287a645f4379f916b94ee.jpg"
},
{
"name": "黄渤",
"role": " 老金",
"avatarAddress": "https://pic.maizuo.com/usr/movie/f2a4a18bf8cf420b09c0a19d20a4a0fc.jpg"
},
{
"name": "周迅",
"role": " 景岚",
"avatarAddress": "https://pic.maizuo.com/usr/movie/323057d90426543e49f5674d8cd42dc7.jpg"
},
{
"name": "祖峰",
"role": " 李烈",
"avatarAddress": "https://pic.maizuo.com/usr/movie/61d27e4e420ad746061a3129dd601d22.jpg"
},
{
"name": "张宥浩",
"role": " 李苗苗",
"avatarAddress": "https://pic.maizuo.com/usr/movie/c46428aea1bcfa2e53c1af240f791755.jpg"
}
],
"director": "曹保平",
"category": "剧情|犯罪|悬疑",
"synopsis": "老金(黄渤 饰)为供女儿金丽娜(周依然 饰)留学终日捕鱼,却换来女儿身中17刀离奇身亡的死讯,最大嫌疑人则指向她的男友李苗苗(张宥浩 饰)。愤怒的老金踏上跨海寻仇之路,李苗苗却在母亲景岚(周迅 饰)的庇护下不断潜逃……这场人性迷局中,究竟谁能抵达爱与宽恕的彼岸?",
"filmType": {
"name": "2D",
"value": 1
},
"nation": "中国大陆",
"language": "",
"videoId": "",
"premiereAt": 1700870400,
"timeType": 3,
"runtime": 144,
"grade": "7.7",
"item": {
"name": "2D",
"type": 1
},
"isPresale": true,
"isSale": false
},
{
"filmId": 6653,
"name": "再见,李可乐",
"poster": "https://pic.maizuo.com/usr/movie/420f90817e5208626a4df71a6688ea91.jpg",
"actors": [
{
"name": "王小列",
"role": "导演",
"avatarAddress": "https://pic.maizuo.com/usr/movie/3c6b3f4cf4ddb082bc7ca02c49697dc4.jpg"
},
{
"name": "闫妮",
"role": " 潘雁秋",
"avatarAddress": "https://pic.maizuo.com/usr/movie/d760dccb352ace3cf12b9a69d457d786.jpg"
},
{
"name": "谭松韵",
"role": " 李妍",
"avatarAddress": "https://pic.maizuo.com/usr/movie/3a5c4448876e1b93c02b459247918530.jpg"
},
{
"name": "吴京",
"role": " 李博宇",
"avatarAddress": "https://pic.maizuo.com/usr/movie/80f93f06a5fcbbbf0a9085125b2a93b2.jpg"
},
{
"name": "蒋龙",
"role": " 张怀军",
"avatarAddress": "https://pic.maizuo.com/usr/movie/64cc2a1c2e6d12f82125f652bef605aa.jpg"
}
],
"director": "王小列",
"category": "剧情|家庭",
"synopsis": "为了完成女儿李妍(谭松韵 饰)高三前的小小心愿,父亲李博宇(吴京 饰)决心带着女儿远赴阿勒泰滑雪。却不料李博宇遭遇意外,全力抢救后仍陷入脑死亡的处境,让为妻为母的潘雁秋(闫妮 饰)做出了一个女人最艰难的决定。当家渐渐失温,一只名为可乐的小狗带着倔强闯入了她们的生活,成为母女争执的焦点,也成为苦乐烟火的陪伴。如何在伤痛后放下悔与执?如何在成长中习得爱与勇?当往日的困境重现,她们的人生,又是否有无憾的选择?",
"filmType": {
"name": "2D",
"value": 1
},
"nation": "中国大陆",
"language": "",
"videoId": "",
"premiereAt": 1701388800,
"timeType": 3,
"runtime": 105,
"grade": "7.8",
"item": {
"name": "2D",
"type": 1
},
"isPresale": true,
"isSale": false
},
{
"filmId": 6675,
"name": "怒潮",
"poster": "https://pic.maizuo.com/usr/movie/e10a3b511bcf9dc350984170ac7f961e.jpg",
"actors": [
{
"name": "马浴柯",
"role": "导演",
"avatarAddress": "https://pic.maizuo.com/usr/movie/9556214134b54d2d88c1382a6a1e93dc.jpg"
},
{
"name": "张家辉",
"role": "演员",
"avatarAddress": "https://pic.maizuo.com/usr/movie/fc8a03ec7584efd458f3b6c0db4ecd50.jpg"
},
{
"name": "阮经天",
"role": "演员",
"avatarAddress": "https://pic.maizuo.com/usr/movie/ed976762b67b126097c9356bca130b7a.jpg"
},
{
"name": "王大陆",
"role": "演员",
"avatarAddress": "https://pic.maizuo.com/usr/movie/1d416e6ceb5529dc890c91236231e227.jpg"
},
{
"name": "秦沛",
"role": "演员",
"avatarAddress": "https://pic.maizuo.com/usr/movie/eb00ffa7b42a18d600943044fbf65fcd.jpg"
}
],
"director": "马浴柯",
"category": "犯罪|动作",
"synopsis": "张家辉、阮经天双影帝首度合作,王大陆颠覆形象实力转型,三人上演黑吃黑生猛互搏!横跨黑白两道只手遮天的洪泰集团正值换选之际,一个神秘杀手陈安(张家辉 饰)却突然只身闯入这个是非混乱的旋涡,搅得洪泰集团大乱。身处警察阵营的麦朗汶(阮经天 饰)和黑帮阵营的马文康(王大陆 饰)也盯上了他……各方势力伺机而动,谁才是幕后的操控者?一场生猛混战一触即发。",
"filmType": {
"name": "4D",
"value": 13
},
"nation": "中国大陆",
"language": "",
"videoId": "",
"premiereAt": 1702684800,
"timeType": 3,
"runtime": 106,
"item": {
"name": "4D",
"type": 13
},
"isPresale": true,
"isSale": false
}
],
"msg": "ok"
}

__END__