lazyad 0.0.42__tar.gz → 0.0.43__tar.gz

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.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lazyad
3
- Version: 0.0.42
3
+ Version: 0.0.43
4
4
  Summary: 基于Python的懒人包-适用于广告投放模块
5
5
  Home-page: https://gitee.com/ZeroSeeker/lazyad
6
6
  Author: ZeroSeeker
@@ -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:
@@ -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,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lazyad
3
- Version: 0.0.42
3
+ Version: 0.0.43
4
4
  Summary: 基于Python的懒人包-适用于广告投放模块
5
5
  Home-page: https://gitee.com/ZeroSeeker/lazyad
6
6
  Author: ZeroSeeker
@@ -12,4 +12,5 @@ lazyad/crawlers/mintegral.py
12
12
  lazyad/crawlers/oceanengine.py
13
13
  lazyad/crawlers/qq.py
14
14
  lazyad/open/__init__.py
15
+ lazyad/open/mintegral.py
15
16
  lazyad/open/qq.py
@@ -13,7 +13,7 @@ with open("README.md", "r", encoding='utf-8') as fh:
13
13
 
14
14
  setuptools.setup(
15
15
  name="lazyad",
16
- version="0.0.42",
16
+ version="0.0.43",
17
17
  description="基于Python的懒人包-适用于广告投放模块",
18
18
  long_description=long_description,
19
19
  long_description_content_type="text/markdown",
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes