lazyad 0.0.42__py3-none-any.whl → 0.0.43__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of lazyad might be problematic. Click here for more details.
- lazyad/crawlers/mintegral.py +4 -0
- lazyad/open/mintegral.py +349 -0
- {lazyad-0.0.42.dist-info → lazyad-0.0.43.dist-info}/METADATA +1 -1
- {lazyad-0.0.42.dist-info → lazyad-0.0.43.dist-info}/RECORD +6 -5
- {lazyad-0.0.42.dist-info → lazyad-0.0.43.dist-info}/WHEEL +0 -0
- {lazyad-0.0.42.dist-info → lazyad-0.0.43.dist-info}/top_level.txt +0 -0
lazyad/crawlers/mintegral.py
CHANGED
|
@@ -136,6 +136,7 @@ def performance(
|
|
|
136
136
|
sort: str = None,
|
|
137
137
|
order: str = "DESC",
|
|
138
138
|
adv_campaign_id: int = None,
|
|
139
|
+
promote_country_code: str = None,
|
|
139
140
|
timeout: int = default_timeout
|
|
140
141
|
):
|
|
141
142
|
"""
|
|
@@ -157,6 +158,7 @@ def performance(
|
|
|
157
158
|
ad_type:广告类型
|
|
158
159
|
:param sort: [可选-排序] 排序依据(高级选项):adv_install:转化
|
|
159
160
|
:param adv_campaign_id: [可选-筛选]广告名称
|
|
161
|
+
:param promote_country_code: [可选-筛选]投放区域
|
|
160
162
|
"""
|
|
161
163
|
scheme = "https"
|
|
162
164
|
host = "ss-api.mintegral.com"
|
|
@@ -210,6 +212,8 @@ def performance(
|
|
|
210
212
|
}
|
|
211
213
|
if sort:
|
|
212
214
|
params["sort"] = sort
|
|
215
|
+
if adv_campaign_id:
|
|
216
|
+
params["adv_campaign_id"] = adv_campaign_id
|
|
213
217
|
headers = copy.deepcopy(default_headers)
|
|
214
218
|
headers["Cookie"] = cookie
|
|
215
219
|
if total:
|
lazyad/open/mintegral.py
ADDED
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
from lazysdk import lazyrequests
|
|
2
|
+
from lazysdk import lazytime
|
|
3
|
+
import showlog
|
|
4
|
+
import hashlib
|
|
5
|
+
import time
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def convert_data2dict(data):
|
|
9
|
+
data_lines = data.split("\n")
|
|
10
|
+
res = list()
|
|
11
|
+
if len(data_lines) == 1:
|
|
12
|
+
return
|
|
13
|
+
else:
|
|
14
|
+
dict_key_line = data_lines[0]
|
|
15
|
+
dict_keys = dict_key_line.split("\t")
|
|
16
|
+
dict_value_lines = data_lines[1: -1]
|
|
17
|
+
for each_line in dict_value_lines:
|
|
18
|
+
each_line_values = each_line.split("\t")
|
|
19
|
+
temp_dict = dict(zip(dict_keys, each_line_values))
|
|
20
|
+
res.append(temp_dict)
|
|
21
|
+
return res
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def convert_format(data):
|
|
25
|
+
data_list = convert_data2dict(data=data)
|
|
26
|
+
for each in data_list:
|
|
27
|
+
# each["Offer_Id"] = each["Offer Id"]
|
|
28
|
+
each["Date"] = f'{each["Date"][0:4]}-{each["Date"][4:6]}-{each["Date"][6:8]}' # 日期
|
|
29
|
+
each["Impression"] = eval(each["Impression"])
|
|
30
|
+
each["Click"] = eval(each["Click"])
|
|
31
|
+
each["Conversion"] = eval(each["Conversion"])
|
|
32
|
+
each["Ecpm"] = eval(each["Ecpm"])
|
|
33
|
+
each["Cpc"] = eval(each["Cpc"])
|
|
34
|
+
each["Ctr"] = eval(each["Ctr"])
|
|
35
|
+
each["Cvr"] = eval(each["Cvr"])
|
|
36
|
+
each["Ivr"] = eval(each["Ivr"])
|
|
37
|
+
each["Spend"] = eval(each["Spend"])
|
|
38
|
+
return data_list
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def make_token(api_key):
|
|
42
|
+
"""
|
|
43
|
+
生成token算法,使用时生成
|
|
44
|
+
参考:https://adv.mintegral.com/doc/cn/guide/introduction/token.html
|
|
45
|
+
:param api_key:
|
|
46
|
+
:return:
|
|
47
|
+
"""
|
|
48
|
+
timestamp = int(time.time())
|
|
49
|
+
|
|
50
|
+
# 计算时间戳的MD5哈希值
|
|
51
|
+
timestamp_md5 = hashlib.md5(str(timestamp).encode()).hexdigest()
|
|
52
|
+
|
|
53
|
+
# 将API密钥与时间戳的MD5哈希值连接,并计算最终的MD5哈希值
|
|
54
|
+
token = hashlib.md5((api_key + timestamp_md5).encode()).hexdigest()
|
|
55
|
+
return {"timestamp": timestamp, "token": token}
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def get_report(
|
|
59
|
+
api_key: str,
|
|
60
|
+
access_key: str,
|
|
61
|
+
timezone: str = "+8",
|
|
62
|
+
start_date: str = None,
|
|
63
|
+
end_date: str = None,
|
|
64
|
+
time_granularity: str = "daily",
|
|
65
|
+
req_type: int = 1,
|
|
66
|
+
dimension_option: list = None
|
|
67
|
+
):
|
|
68
|
+
"""
|
|
69
|
+
广告投放报表_进阶版
|
|
70
|
+
https://adv.mintegral.com/doc/cn/guide/report/advancedPerformanceReport.html
|
|
71
|
+
|
|
72
|
+
{'code': 201, 'msg': 'Successful reception'}
|
|
73
|
+
200 => 生成数据完成,可使用 type=2 获取数据。
|
|
74
|
+
201 => 接收请求成功,等待生成数据。
|
|
75
|
+
202 => 数据正在生成中。
|
|
76
|
+
10000 => 参数错误或权限缺失。
|
|
77
|
+
|
|
78
|
+
:param api_key:
|
|
79
|
+
:param access_key:
|
|
80
|
+
:param timezone: 时区
|
|
81
|
+
:param start_date: 开始日期
|
|
82
|
+
:param end_date: 结束日期
|
|
83
|
+
:param time_granularity:
|
|
84
|
+
:return:
|
|
85
|
+
"""
|
|
86
|
+
url = "https://ss-api.mintegral.com/api/v2/reports/data"
|
|
87
|
+
token_info = make_token(api_key=api_key)
|
|
88
|
+
params = {"access-key": access_key}
|
|
89
|
+
params.update(token_info)
|
|
90
|
+
|
|
91
|
+
if timezone:
|
|
92
|
+
params["timezone"] = timezone
|
|
93
|
+
if not start_date:
|
|
94
|
+
start_date = lazytime.get_date_string(days=-1)
|
|
95
|
+
if not end_date:
|
|
96
|
+
end_date = lazytime.get_date_string(days=0)
|
|
97
|
+
params["start_time"] = start_date
|
|
98
|
+
params["end_time"] = end_date
|
|
99
|
+
params["time_granularity"] = time_granularity
|
|
100
|
+
params["type"] = req_type
|
|
101
|
+
if not dimension_option:
|
|
102
|
+
params["dimension_option"] = "Offer"
|
|
103
|
+
else:
|
|
104
|
+
params["dimension_option"] = ",".join(dimension_option)
|
|
105
|
+
if req_type == 1:
|
|
106
|
+
return lazyrequests.lazy_requests(
|
|
107
|
+
method="GET",
|
|
108
|
+
url=url,
|
|
109
|
+
params=params
|
|
110
|
+
)
|
|
111
|
+
elif req_type == 2:
|
|
112
|
+
return lazyrequests.lazy_requests(
|
|
113
|
+
method="GET",
|
|
114
|
+
url=url,
|
|
115
|
+
params=params,
|
|
116
|
+
return_json=False
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def get_report_until_success(
|
|
121
|
+
api_key: str,
|
|
122
|
+
access_key: str,
|
|
123
|
+
timezone: str = "+0",
|
|
124
|
+
start_date: str = None,
|
|
125
|
+
end_date: str = None,
|
|
126
|
+
time_granularity: str = "daily",
|
|
127
|
+
dimension_option: list = None
|
|
128
|
+
):
|
|
129
|
+
"""
|
|
130
|
+
{'code': 201, 'msg': 'Successful reception'}
|
|
131
|
+
200 => 生成数据完成,可使用 type=2 获取数据。
|
|
132
|
+
201 => 接收请求成功,等待生成数据。
|
|
133
|
+
202 => 数据正在生成中。
|
|
134
|
+
10000 => 参数错误或权限缺失。
|
|
135
|
+
"""
|
|
136
|
+
req_type = 1
|
|
137
|
+
while True:
|
|
138
|
+
res = get_report(
|
|
139
|
+
api_key=api_key,
|
|
140
|
+
access_key=access_key,
|
|
141
|
+
req_type=req_type,
|
|
142
|
+
dimension_option=dimension_option,
|
|
143
|
+
start_date=start_date,
|
|
144
|
+
end_date=end_date,
|
|
145
|
+
time_granularity=time_granularity,
|
|
146
|
+
timezone=timezone
|
|
147
|
+
)
|
|
148
|
+
if res["code"] == 201:
|
|
149
|
+
showlog.info("接收请求成功,等待生成数据。")
|
|
150
|
+
lazytime.count_down(5)
|
|
151
|
+
elif res["code"] == 202:
|
|
152
|
+
showlog.info("数据正在生成中。")
|
|
153
|
+
lazytime.count_down(5)
|
|
154
|
+
elif res["code"] == 200:
|
|
155
|
+
showlog.info("生成数据完成,可使用 type=2 获取数据。")
|
|
156
|
+
req_type = 2
|
|
157
|
+
res = get_report(
|
|
158
|
+
api_key=api_key,
|
|
159
|
+
access_key=access_key,
|
|
160
|
+
req_type=req_type,
|
|
161
|
+
dimension_option=dimension_option,
|
|
162
|
+
start_date=start_date,
|
|
163
|
+
end_date=end_date,
|
|
164
|
+
time_granularity=time_granularity,
|
|
165
|
+
timezone=timezone
|
|
166
|
+
)
|
|
167
|
+
return convert_format(res.text)
|
|
168
|
+
elif res["code"] == 10000:
|
|
169
|
+
showlog.warning(res)
|
|
170
|
+
return
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def get_app_name(
|
|
174
|
+
package_name: str,
|
|
175
|
+
api_key: str,
|
|
176
|
+
access_key: str
|
|
177
|
+
):
|
|
178
|
+
"""
|
|
179
|
+
通过包名获取对应的 APP 名称
|
|
180
|
+
https://adv.mintegral.com/doc/cn/guide/report/acquiringAppName.html
|
|
181
|
+
:param api_key:
|
|
182
|
+
:param access_key:
|
|
183
|
+
:param package_name: 包名
|
|
184
|
+
:return:
|
|
185
|
+
"""
|
|
186
|
+
url = "https://ss-api.mintegral.com/api/open/v1/target-apps/app-name"
|
|
187
|
+
token_info = make_token(api_key=api_key)
|
|
188
|
+
params = {"access-key": access_key}
|
|
189
|
+
params.update(token_info)
|
|
190
|
+
|
|
191
|
+
params["package_name"] = package_name
|
|
192
|
+
|
|
193
|
+
return lazyrequests.lazy_requests(
|
|
194
|
+
method="POST",
|
|
195
|
+
url=url,
|
|
196
|
+
params=params,
|
|
197
|
+
data={"package_name": package_name}
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def update_traffic(
|
|
202
|
+
api_key: str,
|
|
203
|
+
access_key: str,
|
|
204
|
+
offer_id: int,
|
|
205
|
+
option: str,
|
|
206
|
+
mtg_ids: list = None,
|
|
207
|
+
):
|
|
208
|
+
"""
|
|
209
|
+
更新流量投放状态;
|
|
210
|
+
广告单元里需要优化的流量 mtgid。如果 mtgid 传空,则清空黑白名单。多个用,号分隔,最多 3000 个。
|
|
211
|
+
https://adv.mintegral.com/doc/cn/guide/offer/updateTraffic.html
|
|
212
|
+
:param api_key:
|
|
213
|
+
:param access_key:
|
|
214
|
+
:param offer_id: 广告单元 ID
|
|
215
|
+
:param option:
|
|
216
|
+
ENABLE:表示将某个 mtgid 添加进白名单或者将某个 mtgid 从黑名单剔除
|
|
217
|
+
DISABLE:表示将某个 mtgid 添加进黑名单或者将某个 mtgid 从白名单剔除。
|
|
218
|
+
ALLOW_ALL:表示恢复所有 App 的投放状态,取消黑白名单的设置。
|
|
219
|
+
:param mtg_ids: 广告单元里需要优化的流量 mtgid。仅option 传 "ALLOW_ALL" 时,mtgid 可传空,如果 mtgid 传空,则清空黑白名单。多个用,号分隔,最多 3000 个。
|
|
220
|
+
注: 该接口采取全量更新方式,请提交完整的黑白名单设置。
|
|
221
|
+
:return:
|
|
222
|
+
"""
|
|
223
|
+
url = "https://ss-api.mintegral.com/api/open/v1/offer/target"
|
|
224
|
+
token_info = make_token(api_key=api_key)
|
|
225
|
+
params = {"access-key": access_key}
|
|
226
|
+
params.update(token_info)
|
|
227
|
+
mtg_ids_new = set(mtg_ids) # 去重复
|
|
228
|
+
mtgid = ",".join(mtg_ids_new)
|
|
229
|
+
return lazyrequests.lazy_requests(
|
|
230
|
+
method="PUT",
|
|
231
|
+
url=url,
|
|
232
|
+
params=params,
|
|
233
|
+
data={
|
|
234
|
+
"offer_id": offer_id,
|
|
235
|
+
"option": option,
|
|
236
|
+
"mtgid": mtgid
|
|
237
|
+
}
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def get_offer(
|
|
242
|
+
api_key: str,
|
|
243
|
+
access_key: str,
|
|
244
|
+
page: int = 1,
|
|
245
|
+
limit: int = 10
|
|
246
|
+
):
|
|
247
|
+
"""
|
|
248
|
+
获取广告单元列表
|
|
249
|
+
https://adv.mintegral.com/doc/cn/guide/offer/getOffer.html
|
|
250
|
+
:param api_key:
|
|
251
|
+
:param access_key:
|
|
252
|
+
:param page: 页数
|
|
253
|
+
:param limit: 每页数量,最大值:50;大于 50 时,接口只返回 50 个
|
|
254
|
+
:return:
|
|
255
|
+
"""
|
|
256
|
+
url = "https://ss-api.mintegral.com/api/open/v1/offers"
|
|
257
|
+
token_info = make_token(api_key=api_key)
|
|
258
|
+
params = {"access-key": access_key}
|
|
259
|
+
params.update(token_info)
|
|
260
|
+
|
|
261
|
+
if page:
|
|
262
|
+
params["page"] = page
|
|
263
|
+
if limit:
|
|
264
|
+
params["limit"] = limit
|
|
265
|
+
|
|
266
|
+
return lazyrequests.lazy_requests(
|
|
267
|
+
method="GET",
|
|
268
|
+
url=url,
|
|
269
|
+
params=params
|
|
270
|
+
)
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
def get_offer_all(
|
|
274
|
+
api_key: str,
|
|
275
|
+
access_key: str
|
|
276
|
+
):
|
|
277
|
+
"""
|
|
278
|
+
获取广告单元列表
|
|
279
|
+
:param api_key:
|
|
280
|
+
:param access_key:
|
|
281
|
+
:return:
|
|
282
|
+
"""
|
|
283
|
+
page = 1
|
|
284
|
+
limit = 10
|
|
285
|
+
offers = list()
|
|
286
|
+
while True:
|
|
287
|
+
showlog.info(f"正在获取第 {page} 页的数据...")
|
|
288
|
+
temp_res = get_offer(
|
|
289
|
+
page=page,
|
|
290
|
+
limit=limit,
|
|
291
|
+
api_key=api_key,
|
|
292
|
+
access_key=access_key
|
|
293
|
+
)
|
|
294
|
+
if temp_res["code"] == 200:
|
|
295
|
+
data = temp_res["data"]
|
|
296
|
+
if not data:
|
|
297
|
+
break
|
|
298
|
+
else:
|
|
299
|
+
data_list = data["list"]
|
|
300
|
+
if data_list:
|
|
301
|
+
offers.extend(data_list)
|
|
302
|
+
page += 1
|
|
303
|
+
continue
|
|
304
|
+
else:
|
|
305
|
+
break
|
|
306
|
+
else:
|
|
307
|
+
showlog.warning(temp_res)
|
|
308
|
+
break
|
|
309
|
+
return offers
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
def update_budget(
|
|
313
|
+
api_key: str,
|
|
314
|
+
access_key: str,
|
|
315
|
+
offer_id: int,
|
|
316
|
+
option: str,
|
|
317
|
+
mtg_ids: list = None,
|
|
318
|
+
):
|
|
319
|
+
"""
|
|
320
|
+
更新预算
|
|
321
|
+
广告单元里需要优化的流量 mtgid。如果 mtgid 传空,则清空黑白名单。多个用,号分隔,最多 3000 个。
|
|
322
|
+
https://adv.mintegral.com/doc/cn/guide/offer/updateBudget.html
|
|
323
|
+
:param api_key:
|
|
324
|
+
:param access_key:
|
|
325
|
+
:param offer_id: 广告单元 ID
|
|
326
|
+
:param option:
|
|
327
|
+
ENABLE:表示将某个 mtgid 添加进白名单或者将某个 mtgid 从黑名单剔除
|
|
328
|
+
DISABLE:表示将某个 mtgid 添加进黑名单或者将某个 mtgid 从白名单剔除。
|
|
329
|
+
ALLOW_ALL:表示恢复所有 App 的投放状态,取消黑白名单的设置。
|
|
330
|
+
:param mtg_ids: 广告单元里需要优化的流量 mtgid。仅option 传 "ALLOW_ALL" 时,mtgid 可传空,如果 mtgid 传空,则清空黑白名单。多个用,号分隔,最多 3000 个。
|
|
331
|
+
注: 该接口采取全量更新方式,请提交完整的黑白名单设置。
|
|
332
|
+
:return:
|
|
333
|
+
"""
|
|
334
|
+
url = "https://ss-api.mintegral.com/api/open/v1/offer/budget"
|
|
335
|
+
token_info = make_token(api_key=api_key)
|
|
336
|
+
params = {"access-key": access_key}
|
|
337
|
+
params.update(token_info)
|
|
338
|
+
|
|
339
|
+
mtgid = ",".join(mtg_ids)
|
|
340
|
+
return lazyrequests.lazy_requests(
|
|
341
|
+
method="PUT",
|
|
342
|
+
url=url,
|
|
343
|
+
params=params,
|
|
344
|
+
data={
|
|
345
|
+
"offer_id": offer_id,
|
|
346
|
+
"option": option,
|
|
347
|
+
"mtgid": mtgid
|
|
348
|
+
}
|
|
349
|
+
)
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
lazyad/__init__.py,sha256=tnVTFEgdzgMWQI0mZqy3DAueMJjpypPb15DdxJ-9TiU,41
|
|
2
2
|
lazyad/crawlers/__init__.py,sha256=GK3GGpiUJbESc1uGTwSmEnsSUwYDNZfJCxeLYB4CpS4,68
|
|
3
3
|
lazyad/crawlers/chuangliang.py,sha256=nU57GkUGAXcu8TquqB9hg8Ysvl5E3ZlGX6pedj_nIwo,24830
|
|
4
|
-
lazyad/crawlers/mintegral.py,sha256=
|
|
4
|
+
lazyad/crawlers/mintegral.py,sha256=vgF1TwnvvqAVvZPqRRJyZ0qo1_9ARVt2f2brKjdkyvU,7043
|
|
5
5
|
lazyad/crawlers/oceanengine.py,sha256=kjBEpCb_h5OpodCTqzvXd5MBBwAuw3Oq5UKWoTCXrQM,4540
|
|
6
6
|
lazyad/crawlers/qq.py,sha256=X_VjdgzAcDfckEAHrvdqBLtnmAuCBHPJVWu2H-IHZBA,5649
|
|
7
7
|
lazyad/open/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
|
+
lazyad/open/mintegral.py,sha256=YJbDMyzDct8-zjJXFreOVVHKOz6xuIale3aS7HsPuSM,10917
|
|
8
9
|
lazyad/open/qq.py,sha256=pru1p4LCjURD9N5ukx-OStYAmDCvrTW4VMB2N0-3i5Q,6904
|
|
9
|
-
lazyad-0.0.
|
|
10
|
-
lazyad-0.0.
|
|
11
|
-
lazyad-0.0.
|
|
12
|
-
lazyad-0.0.
|
|
10
|
+
lazyad-0.0.43.dist-info/METADATA,sha256=KlQ51rMyassu2-GQ_NfqaD4wSK6SNspXYeo93nHlP7Y,1884
|
|
11
|
+
lazyad-0.0.43.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
|
|
12
|
+
lazyad-0.0.43.dist-info/top_level.txt,sha256=RAPjtj4gZYpsKAM3fAQrWyyn84xjdRuaiUS76gx6eNs,7
|
|
13
|
+
lazyad-0.0.43.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|