kuaishouchuangzuozhe.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. # import json
  2. # import os
  3. # from hashlib import md5
  4. # import requests
  5. # import time
  6. # from urllib.parse import urlencode
  7. # from datetime import datetime, timedelta
  8. #
  9. # from common import Oss, Feishu, Common, AliyunLogger
  10. # from common.sql_help import sqlCollect
  11. #
  12. # headers = {
  13. # 'Accept-Language': 'zh-cn',
  14. # 'Connection': 'keep-alive',
  15. # 'Content-Type': 'application/x-www-form-urlencoded',
  16. # 'Host': 'creator-app.kuaishou.com',
  17. # 'User-Agent': 'kwai-android aegon/3.12.1',
  18. # }
  19. # class KsFeedVideo:
  20. # CATEGORY_IDS = {
  21. # 1: "生活",
  22. # 2: "才艺",
  23. # # 3: "时尚",
  24. # # 4: "宠物",
  25. # 5: "读书",
  26. # # 6: "二次元",
  27. # 7: "家居",
  28. # # 8: "数码",
  29. # 9: "搞笑",
  30. # 10: "健康",
  31. # 11: "旅游",
  32. # 12: "美食",
  33. # # 13: "美妆",
  34. # # 14: "汽车",
  35. # 15: "亲子",
  36. # 16: "情感",
  37. # # 17: "三农",
  38. # # 18: "摄影",
  39. # # 19: "舞蹈",
  40. # # 20: "颜值",
  41. # # 21: "音乐",
  42. # # 22: "影视",
  43. # # 23: "短剧",
  44. # # 24: "游戏",
  45. # 25: "运动",
  46. # 26: "资讯",
  47. # 27: "人文"
  48. # }
  49. # current_category_index = 0
  50. #
  51. # @staticmethod
  52. # def calculate_sig(data):
  53. # src = ''.join([f'{key}={data[key]}' for key in sorted(data.keys())])
  54. # salt = '08d8eece8e83'
  55. # return md5(f'{src}{salt}'.encode()).hexdigest()
  56. #
  57. #
  58. # """
  59. # 切换品类
  60. # """
  61. # @classmethod
  62. # def switch_category(cls):
  63. # if cls.current_category_index >= len(cls.CATEGORY_IDS):
  64. # cls.current_category_index = 0
  65. # category_id = list(cls.CATEGORY_IDS.keys())[cls.current_category_index]
  66. # url = 'https://creator-app.kuaishou.com/rest/bamboo/inspiration/n/category/confirm/optimize'
  67. # data = {
  68. # 'isRecommendChange': False,
  69. # 'categoryId': category_id,
  70. # # 'kuaishou.api_st': "Cg9rdWFpc2hvdS5hcGkuc3QSkAGMQoIK2ZpwlQszYISTxSFxzugi58w2U5gpPqa6an0eU6MFcVsXq2rd_K16UTItZ_OzPV-4jmVN5rNXKXW9jL97JV79Y9PqxaR9xOIr1TEyDzpOq2GM-0W1QRW3M8Li_J6NZ5t1hRFCWHBlOESjiBWs7vq4m1bq_ml0dZ6pgEDfpsWNpBaLRzwZwOO1mD4LqO4aEokh6uHql0RmmtbfoBF25r7QOyIgqNv0TBf6mlwS3bjE0K6sl08M1mMPjW1PB9e0Qr494H8oBTAB",
  71. # 'kuaishou.api_st': 'Cg9rdWFpc2hvdS5hcGkuc3QSkAGMQoIK2ZpwlQszYISTxSFxzugi58w2U5gpPqa6an0eU6MFcVsXq2rd_K16UTItZ_OzPV-4jmVN5rNXKXW9jL97JV79Y9PqxaR9xOIr1TEyDzpOq2GM-0W1QRW3M8Li_J6NZ5t1hRFCWHBlOESjiBWs7vq4m1bq_ml0dZ6pgEDfpsWNpBaLRzwZwOO1mD4LqO4aEokh6uHql0RmmtbfoBF25r7QOyIgqNv0TBf6mlwS3bjE0K6sl08M1mMPjW1PB9e0Qr494H8oBTAB;region_ticket=RT_FAC86448E713714136C088FFCC4431455D1FA7E05A6D25DAD4E4B8CC011FB6E8294169DD9',
  72. # 'client_key': '214c9979',
  73. # }
  74. # sig = cls.calculate_sig(data)
  75. # data['sig'] = sig
  76. # response = requests.post(url=url, headers=headers, data=data)
  77. # body = response.content.decode()
  78. # cls.current_category_index += 1
  79. # return body
  80. #
  81. # """
  82. # 获取feed流信息
  83. # """
  84. # @classmethod
  85. # def get_feed_list(cls):
  86. # cls.switch_category()
  87. # url = 'https://creator-app.kuaishou.com/rest/bamboo/inspiration/n/feed'
  88. # data = {
  89. # 'cs': False,
  90. # 'kuaishou.api_st': 'Cg9rdWFpc2hvdS5hcGkuc3QSkAGMQoIK2ZpwlQszYISTxSFxzugi58w2U5gpPqa6an0eU6MFcVsXq2rd_K16UTItZ_OzPV-4jmVN5rNXKXW9jL97JV79Y9PqxaR9xOIr1TEyDzpOq2GM-0W1QRW3M8Li_J6NZ5t1hRFCWHBlOESjiBWs7vq4m1bq_ml0dZ6pgEDfpsWNpBaLRzwZwOO1mD4LqO4aEokh6uHql0RmmtbfoBF25r7QOyIgqNv0TBf6mlwS3bjE0K6sl08M1mMPjW1PB9e0Qr494H8oBTAB;region_ticket=RT_FAC86448E713714136C088FFCC4431455D1FA7E05A6D25DAD4E4B8CC011FB6E8294169DD9',
  91. # # 'kuaishou.api_st': "Cg9rdWFpc2hvdS5hcGkuc3QSkAGMQoIK2ZpwlQszYISTxSFxzugi58w2U5gpPqa6an0eU6MFcVsXq2rd_K16UTItZ_OzPV-4jmVN5rNXKXW9jL97JV79Y9PqxaR9xOIr1TEyDzpOq2GM-0W1QRW3M8Li_J6NZ5t1hRFCWHBlOESjiBWs7vq4m1bq_ml0dZ6pgEDfpsWNpBaLRzwZwOO1mD4LqO4aEokh6uHql0RmmtbfoBF25r7QOyIgqNv0TBf6mlwS3bjE0K6sl08M1mMPjW1PB9e0Qr494H8oBTAB",
  92. # 'client_key': '214c9979',
  93. # }
  94. # sig = cls.calculate_sig(data)
  95. # data['sig'] = sig
  96. # response = requests.post(url=url, headers=headers, data=data)
  97. # body = response.content.decode()
  98. # return body
  99. #
  100. # """
  101. # 获取观众画像
  102. # """
  103. # @classmethod
  104. # def analyze_photo(cls, photo_id):
  105. # url = 'https://creator-app.kuaishou.com/rest/bamboo/inspiration/n/photo/analysis'
  106. #
  107. # headers = {
  108. # 'Accept-Language': 'zh-cn',
  109. # 'Connection': 'keep-alive',
  110. # 'Content-Type': 'application/x-www-form-urlencoded',
  111. # 'Host': 'creator-app.kuaishou.com',
  112. # }
  113. # data = {
  114. # 'photoId': photo_id,
  115. # 'client_key': '214c9979',
  116. # }
  117. # sig = cls.calculate_sig(data)
  118. # data['sig'] = sig
  119. # response = requests.post(url=url, headers=headers, data=data)
  120. # body = response.content.decode()
  121. # json_body = json.loads(body)
  122. # user_range = json_body['data']['play']['userRange']
  123. # if len(user_range) == 0:
  124. # return False, "无画像"
  125. # age_range = user_range['ageRange']
  126. # value = age_range[5]['value']
  127. # value = int(value.strip('%'))
  128. # if value >= 40:
  129. # return False, value
  130. # else:
  131. # return True, value
  132. #
  133. # """
  134. # 视频时长转换成秒
  135. # """
  136. # @classmethod
  137. # def milliseconds_to_seconds(cls, milliseconds):
  138. # seconds = milliseconds / 1000
  139. # return int(seconds)
  140. #
  141. # """
  142. # 判断当前视频是否在90天内
  143. # """
  144. # @classmethod
  145. # def get_video_data(cls, timestamp_str):
  146. # timestamp = datetime.strptime(timestamp_str, "%Y-%m-%d %H:%M:%S")
  147. # # 获取当前时间
  148. # current_time = datetime.now()
  149. # difference = current_time - timestamp
  150. # if difference <= timedelta(days=90):
  151. # return False
  152. # else:
  153. # return True
  154. # """
  155. # 获取票圈ID
  156. # """
  157. # @classmethod
  158. # def get_id_by_category(cls, category_name):
  159. # category_list = [
  160. # {"id": 71502003, "category": "生活"},
  161. # {"id": 71502004, "category": "才艺"},
  162. # {"id": 71502005, "category": "时尚"},
  163. # {"id": 71502006, "category": "宠物"},
  164. # {"id": 71502007, "category": "读书"},
  165. # {"id": 71502008, "category": "二次元"},
  166. # {"id": 71502009, "category": "家居"},
  167. # {"id": 71502010, "category": "数码"},
  168. # {"id": 71502011, "category": "搞笑"},
  169. # {"id": 71502012, "category": "健康"},
  170. # {"id": 71502013, "category": "旅游"},
  171. # {"id": 71502014, "category": "美食"},
  172. # {"id": 71502015, "category": "美妆"},
  173. # {"id": 71502016, "category": "汽车"},
  174. # {"id": 71502018, "category": "亲子"},
  175. # {"id": 71502019, "category": "情感"},
  176. # {"id": 71502020, "category": "三农"},
  177. # {"id": 71502021, "category": "摄影"},
  178. # {"id": 71502022, "category": "舞蹈"},
  179. # {"id": 71502023, "category": "颜值"},
  180. # {"id": 71502024, "category": "音乐"},
  181. # {"id": 71502025, "category": "影视"},
  182. # {"id": 71502026, "category": "短剧"},
  183. # {"id": 71502027, "category": "游戏"},
  184. # {"id": 71502028, "category": "运动"},
  185. # {"id": 71502029, "category": "资讯"},
  186. # {"id": 71502030, "category": "人文"}
  187. # ]
  188. # for category in category_list:
  189. # if category['category'] == category_name:
  190. # return category['id']
  191. # return None
  192. #
  193. # """
  194. # 新生成视频上传到对应账号下
  195. # """
  196. # @classmethod
  197. # def insert_piaoquantv(cls, new_video_path, new_title, n_id, cover):
  198. #
  199. # url = "https://vlogapi.piaoquantv.com/longvideoapi/crawler/video/send"
  200. # headers = {
  201. # 'User-Agent': 'PQSpeed/486 CFNetwork/1410.1 Darwin/22.6.0',
  202. # 'cookie': 'JSESSIONID=4DEA2B5173BB9A9E82DB772C0ACDBC9F; JSESSIONID=D02C334150025222A0B824A98B539B78',
  203. # 'referer': 'http://appspeed.piaoquantv.com',
  204. # 'token': '524a8bc871dbb0f4d4717895083172ab37c02d2f',
  205. # 'accept-language': 'zh-CN,zh-Hans;q=0.9',
  206. # 'Content-Type': 'application/x-www-form-urlencoded'
  207. # }
  208. # payload = {
  209. # 'coverImgPath': cover,
  210. # 'deviceToken': '9ef064f2f7869b3fd67d6141f8a899175dddc91240971172f1f2a662ef891408',
  211. # 'fileExtensions': 'MP4',
  212. # 'loginUid': n_id,
  213. # 'networkType': 'Wi-Fi',
  214. # 'platform': 'iOS',
  215. # 'requestId': 'fb972cbd4f390afcfd3da1869cd7d001',
  216. # 'sessionId': '362290597725ce1fa870d7be4f46dcc2',
  217. # 'subSessionId': '362290597725ce1fa870d7be4f46dcc2',
  218. # 'title': new_title,
  219. # 'token': '524a8bc871dbb0f4d4717895083172ab37c02d2f',
  220. # 'uid': n_id,
  221. # 'versionCode': '486',
  222. # 'versionName': '3.4.12',
  223. # 'videoFromScene': '1',
  224. # 'videoPath': new_video_path,
  225. # 'viewStatus': '1'
  226. # }
  227. # encoded_payload = urlencode(payload)
  228. # response = requests.request("POST", url, headers=headers, data=encoded_payload)
  229. # data = response.json()
  230. # code = data["code"]
  231. # if code == 0:
  232. # new_video_id = data["data"]["id"]
  233. # return new_video_id
  234. # else:
  235. # return None
  236. #
  237. # @classmethod
  238. # def get_data(cls, channel_id, name):
  239. # number = 1
  240. # list = []
  241. # for category_id, category_name in cls.CATEGORY_IDS.items():
  242. # try:
  243. # feed_data = cls.get_feed_list()
  244. # feed_data = json.loads(feed_data)
  245. # feeds = feed_data['feeds']
  246. # for feed in feeds:
  247. # photo_id = feed["photo_id"] # 视频ID
  248. # status = sqlCollect.ks_is_used(photo_id)
  249. #
  250. # user_name = feed["user_name"] # 用户名
  251. # user_sex = feed["user_sex"] # 性别 F为女,U为男
  252. # time_data = feed["time"] # 发布时间
  253. # caption = feed["caption"] # 标题
  254. # view_count = feed["view_count"] # 浏览数
  255. # like_count = feed["like_count"] # 点赞数
  256. # share_count = feed["share_count"] # 分享数
  257. # duration = feed["duration"] # 时长/秒
  258. # duration = cls.milliseconds_to_seconds(duration)
  259. # main_mv_url = feed["main_mv_url"] # 视频链接
  260. # thumbnail_url = feed["thumbnail_url"] # 视频封面
  261. # user_id = feed["user_id"] # 用户id非用户主页id
  262. # log_data = f"user:{user_name},,video_id:{photo_id},,video_url:{main_mv_url},,original_title:{caption},,share_count:{share_count},,view_count:{view_count},,duration:{duration}"
  263. # AliyunLogger.logging(channel_id, name, user_name, photo_id, "扫描到一条视频", "2001", log_data)
  264. # value, age = cls.analyze_photo(photo_id)
  265. # if status:
  266. # AliyunLogger.logging(channel_id, name, user_name, photo_id, "该视频已改造过", "2001", log_data)
  267. # continue
  268. # if value:
  269. # AliyunLogger.logging(channel_id, name, user_name, photo_id, f"不符合规则:50+年龄占比小于40%,实际占比{age}", "2003", log_data)
  270. # sqlCollect.insert_ks_data(user_name, user_sex, time_data, caption, view_count, like_count,
  271. # share_count, duration, main_mv_url, thumbnail_url, user_id, '1',
  272. # photo_id, category_name, age, oss_object=None, video_uid=None)
  273. #
  274. # continue
  275. # video_percent = '%.4f' % (share_count / view_count)
  276. # special = float(0.0005)
  277. # if float(video_percent) < special:
  278. # AliyunLogger.logging(channel_id, name, user_name, photo_id, "不符合规则:分享/浏览小于0.0005", "2003", log_data)
  279. #
  280. # sqlCollect.insert_ks_data(user_name, user_sex, time_data, caption, view_count, like_count, share_count, duration, main_mv_url, thumbnail_url, user_id, '1', photo_id, category_name, age, oss_object=None, video_uid=None)
  281. # continue
  282. # if share_count < 100:
  283. # AliyunLogger.logging(channel_id, name, user_name, photo_id, "不符合规则:分享小于100", "2003", log_data)
  284. #
  285. # sqlCollect.insert_ks_data(user_name, user_sex, time_data, caption, view_count, like_count,
  286. # share_count, duration, main_mv_url, thumbnail_url, user_id, '1',
  287. # photo_id, category_name, age, oss_object=None, video_uid=None)
  288. # continue
  289. # if duration < 30 or duration > 720:
  290. # AliyunLogger.logging(channel_id, name, user_name, photo_id, "不符合规则:时长不符合规则大于720秒/小于30秒", "2003", log_data)
  291. # sqlCollect.insert_ks_data(user_name, user_sex, time_data, caption, view_count, like_count,
  292. # share_count, duration, main_mv_url, thumbnail_url, user_id, '1',
  293. # photo_id, category_name, age, oss_object=None, video_uid=None)
  294. # continue
  295. #
  296. # sqlCollect.insert_ks_data(user_name, user_sex, time_data, caption, view_count,
  297. # like_count, share_count, duration, main_mv_url, thumbnail_url,
  298. # user_id, '0', photo_id, category_name, age, oss_object=None, video_uid=None)
  299. # all_data = {"video_id": photo_id, "cover": thumbnail_url, "video_url": main_mv_url, "rule": video_percent,
  300. # "old_title": caption}
  301. # AliyunLogger.logging(channel_id, name, user_name, photo_id, "符合规则等待改造", "2004", log_data)
  302. #
  303. # list.append(all_data)
  304. # current_time = datetime.now()
  305. # formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S")
  306. # values = [
  307. # [category_name, user_name, photo_id, user_sex, caption, view_count, like_count, share_count, duration,
  308. # main_mv_url, thumbnail_url, user_id, age, '', '', time_data, formatted_time]]
  309. # Feishu.insert_columns("PlcisKhObhzmBothRutc65sJnph", "8fQxFv", "ROWS", 2, 3)
  310. # time.sleep(0.5)
  311. # Feishu.update_values("PlcisKhObhzmBothRutc65sJnph", "8fQxFv", "A3:Z3", values)
  312. # if len(list) == int(number):
  313. # Common.logger("ks-czz").info(f"获取快手创作者视频总数:{len(list)}\n")
  314. # return list
  315. # time.sleep(5)
  316. # except Exception as exc:
  317. # print(f"异常信息: {exc}")
  318. # return list
  319. # return list
  320. #
  321. #
  322. #
  323. # # Example usage:
  324. # if __name__ == "__main__":
  325. # KsFeedVideo.get_data(1)