feishu_api.py 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996
  1. # -*- coding: utf-8 -*-
  2. # @Author: wangkun
  3. # @Time: 2023/1/31
  4. """
  5. 飞书表配置: token 鉴权 / 增删改查 / 机器人报警
  6. """
  7. import json
  8. import os
  9. import sys
  10. import requests
  11. import urllib3
  12. sys.path.append(os.getcwd())
  13. from common import Common
  14. # from common import Common
  15. proxies = {"http": None, "https": None}
  16. class Feishu:
  17. """
  18. 编辑飞书云文档
  19. """
  20. # 看一看爬虫数据表
  21. kanyikan_url = "https://w42nne6hzg.feishu.cn/sheets/shtcngRPoDYAi24x52j2nDuHMih?"
  22. # 快手爬虫数据表
  23. kuaishou_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnICEfaw9llDNQkKgdymM1xf?"
  24. # 微视爬虫数据表
  25. weishi_url = "https://w42nne6hzg.feishu.cn/sheets/shtcn5YSWg91JfVGzj0SFZIRRPh?"
  26. # 小年糕爬虫数据表
  27. xiaoniangao_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnYxiyQ1wLklo1W5Kdqc9cGh?"
  28. # 音乐相册
  29. music_album = "https://w42nne6hzg.feishu.cn/sheets/shtcnT6zvmfsYe1g0iv4pt7855g?"
  30. # 本山祝福数据表
  31. crawler_benshanzhufu = (
  32. "https://w42nne6hzg.feishu.cn/sheets/shtcnGh2rrsPYM4iVNEBO7OqWrb?"
  33. )
  34. # 公众号爬虫表
  35. gzh_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnexNXnpDLHhARw0QdiwbYuA?"
  36. # 数据监控表
  37. crawler_monitor = "https://w42nne6hzg.feishu.cn/sheets/shtcnlZWYazInhf7Z60jkbLRJyd?"
  38. # 微群视频爬虫表
  39. crawler_weiqun_video = (
  40. "https://w42nne6hzg.feishu.cn/sheets/shtcnoKThNquYRweaylMFVyo9Hc?"
  41. )
  42. # 视频号爬虫表
  43. crawler_shipinhao = (
  44. "https://w42nne6hzg.feishu.cn/sheets/shtcn9rOdZRAGFbRkWpn7hqEHGc?"
  45. )
  46. # 西瓜视频
  47. crawler_xigua = "https://w42nne6hzg.feishu.cn/sheets/shtcnvOpx2P8vBXiV91Ot1MKIw8?"
  48. # 知乎 PC 端
  49. crawler_zhihu = "https://w42nne6hzg.feishu.cn/sheets/shtcnkGPBmGsjaqapgzouuj8MXe?"
  50. # 吉祥幸福
  51. crawler_jixiangxingfu = (
  52. "https://w42nne6hzg.feishu.cn/sheets/shtcnSx4nafMbLTq7xl7RHBwHBf?"
  53. )
  54. # 众妙音信
  55. crawler_zmyx = "https://w42nne6hzg.feishu.cn/sheets/shtcnbZIxstPeM0xshW07b26sve?"
  56. # 岁岁年年迎福气
  57. crawler_ssnnyfq = "https://w42nne6hzg.feishu.cn/sheets/shtcnyJmJSJynHDLLbLTkySfvZe?"
  58. # 祝福猫视频
  59. crawler_zhufumao = (
  60. "https://w42nne6hzg.feishu.cn/sheets/shtcnXfIJthvkjhI5zlEJq84i6g?"
  61. )
  62. # 宗教公众号
  63. crawler_zongjiao = (
  64. "https://w42nne6hzg.feishu.cn/sheets/shtcn73NW0CyoOeF21HWO15KBsb?"
  65. )
  66. # 好看视频
  67. crawler_haokan = "https://w42nne6hzg.feishu.cn/sheets/shtcnaYz8Nhv8q6DbWtlL6rMEBd"
  68. # 看到就是福气
  69. crawler_kandaojiushifuqi = (
  70. "https://w42nne6hzg.feishu.cn/sheets/shtcnEokBkIjOUPAk8vbbPKnXgb"
  71. )
  72. # 胜胜影音
  73. crawler_shengshengyingyin = (
  74. "https://w42nne6hzg.feishu.cn/sheets/shtcnz1ymxHL1u8WHblfqfys7qe"
  75. )
  76. # 刚刚都传
  77. crawler_ganggangdouchuan = (
  78. "https://w42nne6hzg.feishu.cn/sheets/shtcnTuJgeZU2bc7VaesAqk3QJx"
  79. )
  80. # 知青天天看
  81. crawler_zhiqingtiantiankan = (
  82. "https://w42nne6hzg.feishu.cn/sheets/shtcnjmhKdJOKdqnEzJcZb5xaHc?"
  83. )
  84. # 公众号_信欣
  85. crawler_gongzhonghao = (
  86. "https://w42nne6hzg.feishu.cn/sheets/shtcna98M2mX7TbivTj9Sb7WKBN?"
  87. )
  88. # YouTube
  89. crawler_youtube = "https://w42nne6hzg.feishu.cn/sheets/shtcnrLyr1zbYbhhZyqpN7Xrd5f?"
  90. # 微信指数
  91. weixinzhishu = "https://w42nne6hzg.feishu.cn/sheets/shtcnqhMRUGunIfGnGXMOBYiy4K?"
  92. # 微信指数_搜索词
  93. weixinzhishu_search_word = (
  94. "https://w42nne6hzg.feishu.cn/sheets/shtcnHxCj6dZBYMuK1Q3tIJVlqg?"
  95. )
  96. # 飞书路径token
  97. @classmethod
  98. def spreadsheettoken(cls, crawler):
  99. """
  100. :param crawler: 哪个爬虫
  101. """
  102. if crawler == "kanyikan":
  103. return "shtcngRPoDYAi24x52j2nDuHMih"
  104. elif crawler == "kuaishou":
  105. return "shtcnICEfaw9llDNQkKgdymM1xf"
  106. elif crawler == "weishi":
  107. return "shtcn5YSWg91JfVGzj0SFZIRRPh"
  108. elif crawler == "xiaoniangao":
  109. return "shtcnYxiyQ1wLklo1W5Kdqc9cGh"
  110. elif crawler == "control":
  111. return "shtcnlZWYazInhf7Z60jkbLRJyd"
  112. elif crawler == "music_album":
  113. return "shtcnT6zvmfsYe1g0iv4pt7855g"
  114. elif crawler == "benshanzhufu":
  115. return "shtcnGh2rrsPYM4iVNEBO7OqWrb"
  116. elif crawler == "gzh":
  117. return "shtcnexNXnpDLHhARw0QdiwbYuA"
  118. elif crawler == "weiqun":
  119. return "shtcnoKThNquYRweaylMFVyo9Hc"
  120. elif crawler == "shipinhao":
  121. return "shtcn9rOdZRAGFbRkWpn7hqEHGc"
  122. elif crawler == "xigua":
  123. return "shtcnvOpx2P8vBXiV91Ot1MKIw8"
  124. elif crawler == "zhihu":
  125. return "shtcnkGPBmGsjaqapgzouuj8MXe"
  126. elif crawler == "jixiangxingfu":
  127. return "shtcnSx4nafMbLTq7xl7RHBwHBf"
  128. elif crawler == "zhongmiaoyinxin":
  129. return "shtcnbZIxstPeM0xshW07b26sve"
  130. elif crawler == "suisuiniannianyingfuqi":
  131. return "shtcnyJmJSJynHDLLbLTkySfvZe"
  132. elif crawler == "zhufumao":
  133. return "shtcnXfIJthvkjhI5zlEJq84i6g"
  134. elif crawler == "zongjiao":
  135. return "shtcn73NW0CyoOeF21HWO15KBsb"
  136. elif crawler == "haokan":
  137. return "shtcnaYz8Nhv8q6DbWtlL6rMEBd"
  138. elif crawler == "kandaojiushifuqi":
  139. return "shtcnEokBkIjOUPAk8vbbPKnXgb"
  140. elif crawler == "shengshengyingyin":
  141. return "shtcnz1ymxHL1u8WHblfqfys7qe"
  142. elif crawler == "ganggangdouchuan":
  143. return "shtcnTuJgeZU2bc7VaesAqk3QJx"
  144. elif crawler == "youtube":
  145. return "shtcnrLyr1zbYbhhZyqpN7Xrd5f"
  146. elif crawler == "weixinzhishu":
  147. return "shtcnqhMRUGunIfGnGXMOBYiy4K"
  148. elif crawler == "weixinzhishu_search_word":
  149. return "shtcnHxCj6dZBYMuK1Q3tIJVlqg"
  150. elif crawler == "gongzhonghao":
  151. return "shtcna98M2mX7TbivTj9Sb7WKBN"
  152. elif crawler == "douyin":
  153. return "shtcnhq63MoXOpqbkuLuoapYIAh"
  154. elif crawler == "zhiqingtiantiankan":
  155. return "shtcnjmhKdJOKdqnEzJcZb5xaHc"
  156. # 获取飞书api token
  157. @classmethod
  158. def get_token(cls, log_type, crawler):
  159. """
  160. 获取飞书api token
  161. :return:
  162. """
  163. url = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal/"
  164. post_data = {
  165. "app_id": "cli_a13ad2afa438d00b", # 这里账号密码是发布应用的后台账号及密码
  166. "app_secret": "4tK9LY9VbiQlY5umhE42dclBFo6t4p5O",
  167. }
  168. try:
  169. urllib3.disable_warnings()
  170. response = requests.post(
  171. url=url, data=post_data, proxies=proxies, verify=False
  172. )
  173. tenant_access_token = response.json()["tenant_access_token"]
  174. return tenant_access_token
  175. except Exception as e:
  176. Common.logger(log_type, crawler).error("获取飞书 api token 异常:{}", e)
  177. # 获取表格元数据
  178. @classmethod
  179. def get_metainfo(cls, log_type, crawler):
  180. """
  181. 获取表格元数据
  182. :return:
  183. """
  184. try:
  185. get_metainfo_url = (
  186. "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/"
  187. + cls.spreadsheettoken(crawler)
  188. + "/metainfo"
  189. )
  190. headers = {
  191. "Authorization": "Bearer " + cls.get_token(log_type, crawler),
  192. "Content-Type": "application/json; charset=utf-8",
  193. }
  194. params = {
  195. "extFields": "protectedRange", # 额外返回的字段,extFields=protectedRange时返回保护行列信息
  196. "user_id_type": "open_id", # 返回的用户id类型,可选open_id,union_id
  197. }
  198. urllib3.disable_warnings()
  199. r = requests.get(
  200. url=get_metainfo_url,
  201. headers=headers,
  202. params=params,
  203. proxies=proxies,
  204. verify=False,
  205. )
  206. response = json.loads(r.content.decode("utf8"))
  207. return response
  208. except Exception as e:
  209. Common.logger(log_type, crawler).error("获取表格元数据异常:{}", e)
  210. # 读取工作表中所有数据
  211. @classmethod
  212. def get_values_batch(cls, log_type, crawler, sheetid):
  213. """
  214. 读取工作表中所有数据
  215. :param log_type: 启用哪个 log
  216. :param crawler: 哪个爬虫
  217. :param sheetid: 哪张表
  218. :return: 所有数据
  219. """
  220. try:
  221. get_values_batch_url = (
  222. "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/"
  223. + cls.spreadsheettoken(crawler)
  224. + "/values_batch_get"
  225. )
  226. headers = {
  227. "Authorization": "Bearer " + cls.get_token(log_type, crawler),
  228. "Content-Type": "application/json; charset=utf-8",
  229. }
  230. params = {
  231. # 多个查询范围 如 url?ranges=range1,range2 ,其中 range 包含 sheetId 与单元格范围两部分
  232. "ranges": sheetid,
  233. # valueRenderOption=ToString 可返回纯文本的值(数值类型除外);
  234. # valueRenderOption=FormattedValue 计算并格式化单元格;
  235. # valueRenderOption=Formula单元格中含有公式时返回公式本身;
  236. # valueRenderOption=UnformattedValue计算但不对单元格进行格式化
  237. "valueRenderOption": "ToString",
  238. # dateTimeRenderOption=FormattedString 计算并将时间日期按照其格式进行格式化,但不会对数字进行格式化,返回格式化后的字符串。
  239. "dateTimeRenderOption": "",
  240. # 返回的用户id类型,可选open_id,union_id
  241. "user_id_type": "open_id",
  242. }
  243. urllib3.disable_warnings()
  244. r = requests.get(
  245. url=get_values_batch_url,
  246. headers=headers,
  247. params=params,
  248. proxies=proxies,
  249. verify=False,
  250. )
  251. # print(r.text)
  252. response = json.loads(r.content.decode("utf8"))
  253. values = response["data"]["valueRanges"][0]["values"]
  254. return values
  255. except Exception as e:
  256. Common.logger(log_type, crawler).error("读取工作表所有数据异常:{}", e)
  257. # 工作表,插入行或列
  258. @classmethod
  259. def insert_columns(
  260. cls, log_type, crawler, sheetid, majordimension, startindex, endindex
  261. ):
  262. """
  263. 工作表插入行或列
  264. :param log_type: 日志路径
  265. :param crawler: 哪个爬虫的云文档
  266. :param sheetid:哪张工作表
  267. :param majordimension:行或者列, ROWS、COLUMNS
  268. :param startindex:开始位置
  269. :param endindex:结束位置
  270. """
  271. try:
  272. insert_columns_url = (
  273. "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/"
  274. + cls.spreadsheettoken(crawler)
  275. + "/insert_dimension_range"
  276. )
  277. headers = {
  278. "Authorization": "Bearer " + cls.get_token(log_type, crawler),
  279. "Content-Type": "application/json; charset=utf-8",
  280. }
  281. body = {
  282. "dimension": {
  283. "sheetId": sheetid,
  284. "majorDimension": majordimension, # 默认 ROWS ,可选 ROWS、COLUMNS
  285. "startIndex": startindex, # 开始的位置
  286. "endIndex": endindex, # 结束的位置
  287. },
  288. "inheritStyle": "AFTER", # BEFORE 或 AFTER,不填为不继承 style
  289. }
  290. urllib3.disable_warnings()
  291. r = requests.post(
  292. url=insert_columns_url,
  293. headers=headers,
  294. json=body,
  295. proxies=proxies,
  296. verify=False,
  297. )
  298. Common.logger(log_type, crawler).info("插入行或列:{}", r.json()["msg"])
  299. except Exception as e:
  300. Common.logger(log_type, crawler).error("插入行或列异常:{}", e)
  301. # 写入数据
  302. @classmethod
  303. def update_values(cls, log_type, crawler, sheetid, ranges, values):
  304. """
  305. 写入数据
  306. :param log_type: 日志路径
  307. :param crawler: 哪个爬虫的云文档
  308. :param sheetid:哪张工作表
  309. :param ranges:单元格范围
  310. :param values:写入的具体数据,list
  311. """
  312. try:
  313. update_values_url = (
  314. "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/"
  315. + cls.spreadsheettoken(crawler)
  316. + "/values_batch_update"
  317. )
  318. headers = {
  319. "Authorization": "Bearer " + cls.get_token(log_type, crawler),
  320. "Content-Type": "application/json; charset=utf-8",
  321. }
  322. body = {
  323. "valueRanges": [
  324. {"range": sheetid + "!" + ranges, "values": values},
  325. ],
  326. }
  327. urllib3.disable_warnings()
  328. r = requests.post(
  329. url=update_values_url,
  330. headers=headers,
  331. json=body,
  332. proxies=proxies,
  333. verify=False,
  334. )
  335. Common.logger(log_type, crawler).info("写入数据:{}", r.json()["msg"])
  336. except Exception as e:
  337. Common.logger(log_type, crawler).error("写入数据异常:{}", e)
  338. # 合并单元格
  339. @classmethod
  340. def merge_cells(cls, log_type, crawler, sheetid, ranges):
  341. """
  342. 合并单元格
  343. :param log_type: 日志路径
  344. :param crawler: 哪个爬虫
  345. :param sheetid:哪张工作表
  346. :param ranges:需要合并的单元格范围
  347. """
  348. try:
  349. merge_cells_url = (
  350. "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/"
  351. + cls.spreadsheettoken(crawler)
  352. + "/merge_cells"
  353. )
  354. headers = {
  355. "Authorization": "Bearer " + cls.get_token(log_type, crawler),
  356. "Content-Type": "application/json; charset=utf-8",
  357. }
  358. body = {"range": sheetid + "!" + ranges, "mergeType": "MERGE_ROWS"}
  359. urllib3.disable_warnings()
  360. r = requests.post(
  361. url=merge_cells_url,
  362. headers=headers,
  363. json=body,
  364. proxies=proxies,
  365. verify=False,
  366. )
  367. Common.logger(log_type, crawler).info("合并单元格:{}", r.json()["msg"])
  368. except Exception as e:
  369. Common.logger(log_type, crawler).error("合并单元格异常:{}", e)
  370. # 读取单元格数据
  371. @classmethod
  372. def get_range_value(cls, log_type, crawler, sheetid, cell):
  373. """
  374. 读取单元格内容
  375. :param log_type: 日志路径
  376. :param crawler: 哪个爬虫
  377. :param sheetid: 哪张工作表
  378. :param cell: 哪个单元格
  379. :return: 单元格内容
  380. """
  381. try:
  382. get_range_value_url = (
  383. "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/"
  384. + cls.spreadsheettoken(crawler)
  385. + "/values/"
  386. + sheetid
  387. + "!"
  388. + cell
  389. )
  390. headers = {
  391. "Authorization": "Bearer " + cls.get_token(log_type, crawler),
  392. "Content-Type": "application/json; charset=utf-8",
  393. }
  394. params = {
  395. # valueRenderOption=ToString 可返回纯文本的值(数值类型除外);
  396. # valueRenderOption=FormattedValue 计算并格式化单元格;
  397. # valueRenderOption=Formula 单元格中含有公式时返回公式本身;
  398. # valueRenderOption=UnformattedValue 计算但不对单元格进行格式化。
  399. "valueRenderOption": "FormattedValue",
  400. # dateTimeRenderOption=FormattedString 计算并对时间日期按照其格式进行格式化,但不会对数字进行格式化,返回格式化后的字符串。
  401. "dateTimeRenderOption": "",
  402. # 返回的用户id类型,可选open_id,union_id
  403. "user_id_type": "open_id",
  404. }
  405. urllib3.disable_warnings()
  406. r = requests.get(
  407. url=get_range_value_url,
  408. headers=headers,
  409. params=params,
  410. proxies=proxies,
  411. verify=False,
  412. )
  413. # print(r.text)
  414. return r.json()["data"]["valueRange"]["values"][0]
  415. except Exception as e:
  416. Common.logger(log_type, crawler).error("读取单元格数据异常:{}", e)
  417. # 获取表内容
  418. @classmethod
  419. def get_sheet_content(cls, log_type, crawler, sheet_id):
  420. try:
  421. sheet = Feishu.get_values_batch(log_type, crawler, sheet_id)
  422. content_list = []
  423. for x in sheet:
  424. for y in x:
  425. if y is None:
  426. pass
  427. else:
  428. content_list.append(y)
  429. return content_list
  430. except Exception as e:
  431. Common.logger(log_type, crawler).error(f"get_sheet_content:{e}\n")
  432. # 删除行或列,可选 ROWS、COLUMNS
  433. @classmethod
  434. def dimension_range(
  435. cls, log_type, crawler, sheetid, major_dimension, startindex, endindex
  436. ):
  437. """
  438. 删除行或列
  439. :param log_type: 日志路径
  440. :param crawler: 哪个爬虫
  441. :param sheetid:工作表
  442. :param major_dimension:默认 ROWS ,可选 ROWS、COLUMNS
  443. :param startindex:开始的位置
  444. :param endindex:结束的位置
  445. :return:
  446. """
  447. try:
  448. dimension_range_url = (
  449. "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/"
  450. + cls.spreadsheettoken(crawler)
  451. + "/dimension_range"
  452. )
  453. headers = {
  454. "Authorization": "Bearer " + cls.get_token(log_type, crawler),
  455. "Content-Type": "application/json; charset=utf-8",
  456. }
  457. body = {
  458. "dimension": {
  459. "sheetId": sheetid,
  460. "majorDimension": major_dimension,
  461. "startIndex": startindex,
  462. "endIndex": endindex,
  463. }
  464. }
  465. urllib3.disable_warnings()
  466. r = requests.delete(
  467. url=dimension_range_url,
  468. headers=headers,
  469. json=body,
  470. proxies=proxies,
  471. verify=False,
  472. )
  473. Common.logger(log_type, crawler).info("删除视频数据:{}", r.json()["msg"])
  474. except Exception as e:
  475. Common.logger(log_type, crawler).error("删除视频数据异常:{}", e)
  476. # 获取用户 ID
  477. @classmethod
  478. def get_userid(cls, log_type, crawler, username):
  479. try:
  480. url = "https://open.feishu.cn/open-apis/user/v1/batch_get_id?"
  481. headers = {
  482. "Authorization": "Bearer " + cls.get_token(log_type, crawler),
  483. "Content-Type": "application/json; charset=utf-8",
  484. }
  485. if username == "wangkun":
  486. username = "13426262515"
  487. elif username == "gaonannan":
  488. username = "18501180073"
  489. elif username == "xinxin":
  490. username = "15546206651"
  491. elif username == "huxinxue":
  492. username = "18832292015"
  493. elif username == "wuchaoyue":
  494. username = "15712941385"
  495. elif username == "muxinyi":
  496. username = "13699208058"
  497. elif username == "wangxueke":
  498. username = "13513479926"
  499. elif username == "yuzhuoyi":
  500. username = "18624010360"
  501. elif username == "rennian":
  502. username = "18622113710"
  503. data = {"mobiles": [username]}
  504. urllib3.disable_warnings()
  505. r = requests.get(
  506. url=url, headers=headers, params=data, verify=False, proxies=proxies
  507. )
  508. open_id = r.json()["data"]["mobile_users"][username][0]["open_id"]
  509. # Common.logger(log_type, crawler).info(f"{username}:{open_id}")
  510. # print(f"{username}:{open_id}")
  511. return open_id
  512. except Exception as e:
  513. Common.logger(log_type, crawler).error(f"get_userid异常:{e}\n")
  514. # 飞书机器人
  515. @classmethod
  516. def bot(cls, log_type, crawler, text):
  517. try:
  518. url = "https://open.feishu.cn/open-apis/bot/v2/hook/96989577-50e7-4653-9ec2-308fe3f2c5fe"
  519. headers = {"Content-Type": "application/json"}
  520. if crawler == "kanyikan":
  521. content = "看一看爬虫表"
  522. sheet_url = (
  523. "https://w42nne6hzg.feishu.cn/sheets/shtcngRPoDYAi24x52j2nDuHMih"
  524. )
  525. users = (
  526. "\n<at id="
  527. + str(cls.get_userid(log_type, crawler, "wangkun"))
  528. + "></at> <at id="
  529. + str(cls.get_userid(log_type, crawler, "gaonannan"))
  530. + "></at>\n"
  531. )
  532. elif crawler == "weixinzhishu_out":
  533. content = "微信指数_站外指数"
  534. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnqhMRUGunIfGnGXMOBYiy4K?sheet=YVuVgQ"
  535. users = (
  536. "\n<at id="
  537. + str(cls.get_userid(log_type, crawler, "wangkun"))
  538. + "></at> <at id="
  539. + str(cls.get_userid(log_type, crawler, "muxinyi"))
  540. + "></at>\n"
  541. )
  542. elif crawler == "weixinzhishu_inner_sort":
  543. content = "微信指数_站内短期指数"
  544. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnqhMRUGunIfGnGXMOBYiy4K?sheet=DrZHpa"
  545. users = (
  546. "\n<at id="
  547. + str(cls.get_userid(log_type, crawler, "wangkun"))
  548. + "></at> <at id="
  549. + str(cls.get_userid(log_type, crawler, "muxinyi"))
  550. + "></at>\n"
  551. )
  552. elif crawler == "weixinzhishu_inner_long":
  553. content = "微信指数_站内长期指数"
  554. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnqhMRUGunIfGnGXMOBYiy4K?sheet=JpgyAv"
  555. users = (
  556. "\n<at id="
  557. + str(cls.get_userid(log_type, crawler, "wangkun"))
  558. + "></at> <at id="
  559. + str(cls.get_userid(log_type, crawler, "muxinyi"))
  560. + "></at>\n"
  561. )
  562. elif crawler == "weixinzhishu" and text == "今日微信指数抓取完毕":
  563. content = "微信指数"
  564. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnqhMRUGunIfGnGXMOBYiy4K?sheet=sVL74k"
  565. users = (
  566. "\n<at id="
  567. + str(cls.get_userid(log_type, crawler, "yuzhuoyi"))
  568. + "></at>\n"
  569. )
  570. elif crawler == "weixinzhishu":
  571. content = "微信指数"
  572. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnqhMRUGunIfGnGXMOBYiy4K?sheet=sVL74k"
  573. users = (
  574. "\n<at id="
  575. + str(cls.get_userid(log_type, crawler, "wangkun"))
  576. + "></at> <at id="
  577. + str(cls.get_userid(log_type, crawler, "muxinyi"))
  578. + "></at>\n"
  579. )
  580. elif crawler == "xiaoniangao_hour":
  581. content = "小年糕_小时级_已下载表"
  582. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnYxiyQ1wLklo1W5Kdqc9cGh?sheet=yatRv2"
  583. users = (
  584. "\n<at id="
  585. + str(cls.get_userid(log_type, crawler, "wangkun"))
  586. + "></at> <at id="
  587. + str(cls.get_userid(log_type, crawler, "gaonannan"))
  588. + "></at>\n"
  589. )
  590. elif crawler == "xiaoniangao_person":
  591. content = "小年糕_用户主页_已下载表"
  592. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnYxiyQ1wLklo1W5Kdqc9cGh?sheet=Wu0CeL"
  593. users = (
  594. "\n<at id="
  595. + str(cls.get_userid(log_type, crawler, "wangkun"))
  596. + "></at> <at id="
  597. + str(cls.get_userid(log_type, crawler, "gaonannan"))
  598. + "></at>\n"
  599. )
  600. elif crawler == "xiaoniangao_play":
  601. content = "小年糕_播放量_已下载表"
  602. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnYxiyQ1wLklo1W5Kdqc9cGh?sheet=c85k1C"
  603. users = (
  604. "\n<at id="
  605. + str(cls.get_userid(log_type, crawler, "wangkun"))
  606. + "></at> <at id="
  607. + str(cls.get_userid(log_type, crawler, "gaonannan"))
  608. + "></at>\n"
  609. )
  610. elif crawler == "xigua" and log_type == "recommend":
  611. content = "西瓜视频_推荐_已下载表"
  612. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnvOpx2P8vBXiV91Ot1MKIw8?sheet=ZzsClu"
  613. users = (
  614. "\n<at id="
  615. + str(cls.get_userid(log_type, crawler, "wangkun"))
  616. + "></at> <at id="
  617. + str(cls.get_userid(log_type, crawler, "wangxueke"))
  618. + "></at>\n"
  619. )
  620. elif crawler == "xigua":
  621. content = "西瓜视频_用户主页_已下载表"
  622. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnvOpx2P8vBXiV91Ot1MKIw8?sheet=e075e9"
  623. users = (
  624. "\n<at id="
  625. + str(cls.get_userid(log_type, crawler, "wangkun"))
  626. + "></at> <at id="
  627. + str(cls.get_userid(log_type, crawler, "wuchaoyue"))
  628. + "></at>\n"
  629. )
  630. elif crawler == "xigua_little_video":
  631. content = "西瓜视频_小视频_已下载表"
  632. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnvOpx2P8vBXiV91Ot1MKIw8?sheet=hDSDnv"
  633. users = (
  634. "\n<at id="
  635. + str(cls.get_userid(log_type, crawler, "wangkun"))
  636. + "></at> <at id="
  637. + str(cls.get_userid(log_type, crawler, "wuchaoyue"))
  638. + "></at>\n"
  639. )
  640. elif crawler == "zhihu_hot":
  641. content = "知乎_热门_已下载表"
  642. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnkGPBmGsjaqapgzouuj8MXe?sheet=8871e3"
  643. users = (
  644. "\n<at id="
  645. + str(cls.get_userid(log_type, crawler, "wangkun"))
  646. + "></at> <at id="
  647. + str(cls.get_userid(log_type, crawler, "gaonannan"))
  648. + "></at>\n"
  649. )
  650. elif crawler == "zhihu_follow":
  651. content = "知乎_定向_已下载表"
  652. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnkGPBmGsjaqapgzouuj8MXe?sheet=4MGuux"
  653. users = (
  654. "\n<at id="
  655. + str(cls.get_userid(log_type, crawler, "wangkun"))
  656. + "></at> <at id="
  657. + str(cls.get_userid(log_type, crawler, "gaonannan"))
  658. + "></at>\n"
  659. )
  660. elif crawler == "haokan_hot":
  661. content = "好看_热榜_已下载表"
  662. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnaYz8Nhv8q6DbWtlL6rMEBd?sheet=5pWipX"
  663. users = (
  664. "\n<at id="
  665. + str(cls.get_userid(log_type, crawler, "wangkun"))
  666. + "></at> <at id="
  667. + str(cls.get_userid(log_type, crawler, "wuchaoyue"))
  668. + "></at>\n"
  669. )
  670. elif crawler == "haokan_channel":
  671. content = "好看_频道_已下载表"
  672. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnaYz8Nhv8q6DbWtlL6rMEBd?sheet=7f05d8"
  673. users = (
  674. "\n<at id="
  675. + str(cls.get_userid(log_type, crawler, "wangkun"))
  676. + "></at> <at id="
  677. + str(cls.get_userid(log_type, crawler, "wuchaoyue"))
  678. + "></at>\n"
  679. )
  680. elif crawler == "haokan_follow":
  681. content = "好看_定向_已下载表"
  682. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnaYz8Nhv8q6DbWtlL6rMEBd?sheet=kVaSjf"
  683. users = (
  684. "\n<at id="
  685. + str(cls.get_userid(log_type, crawler, "wangkun"))
  686. + "></at> <at id="
  687. + str(cls.get_userid(log_type, crawler, "wuchaoyue"))
  688. + "></at>\n"
  689. )
  690. elif crawler == "music_album":
  691. content = "音乐相册爬虫表"
  692. sheet_url = (
  693. "https://w42nne6hzg.feishu.cn/sheets/shtcnT6zvmfsYe1g0iv4pt7855g"
  694. )
  695. users = (
  696. "\n<at id="
  697. + str(cls.get_userid(log_type, crawler, "wangkun"))
  698. + "></at> <at id="
  699. + str(cls.get_userid(log_type, crawler, "gaonannan"))
  700. + "></at>\n"
  701. )
  702. elif crawler == "ssyy":
  703. content = "胜胜影音爬虫表"
  704. sheet_url = (
  705. "https://w42nne6hzg.feishu.cn/sheets/shtcnz1ymxHL1u8WHblfqfys7qe"
  706. )
  707. users = (
  708. "\n<at id="
  709. + str(cls.get_userid(log_type, crawler, "wangkun"))
  710. + "></at> <at id="
  711. + str(cls.get_userid(log_type, crawler, "gaonannan"))
  712. + "></at>\n"
  713. )
  714. elif crawler == "ggdc":
  715. content = "刚刚都传爬虫表"
  716. sheet_url = (
  717. "https://w42nne6hzg.feishu.cn/sheets/shtcnTuJgeZU2bc7VaesAqk3QJx"
  718. )
  719. users = (
  720. "\n<at id="
  721. + str(cls.get_userid(log_type, crawler, "wangkun"))
  722. + "></at> <at id="
  723. + str(cls.get_userid(log_type, crawler, "gaonannan"))
  724. + "></at>\n"
  725. )
  726. elif crawler == "bszf":
  727. content = "本山祝福爬虫表"
  728. sheet_url = (
  729. "https://w42nne6hzg.feishu.cn/sheets/shtcnGh2rrsPYM4iVNEBO7OqWrb"
  730. )
  731. users = (
  732. "\n<at id="
  733. + str(cls.get_userid(log_type, crawler, "wangkun"))
  734. + "></at> <at id="
  735. + str(cls.get_userid(log_type, crawler, "gaonannan"))
  736. + "></at>\n"
  737. )
  738. elif crawler == "jxxf":
  739. content = "吉祥幸福爬虫表"
  740. sheet_url = (
  741. "https://w42nne6hzg.feishu.cn/sheets/shtcnSx4nafMbLTq7xl7RHBwHBf"
  742. )
  743. users = (
  744. "\n<at id="
  745. + str(cls.get_userid(log_type, crawler, "wangkun"))
  746. + "></at> <at id="
  747. + str(cls.get_userid(log_type, crawler, "gaonannan"))
  748. + "></at>\n"
  749. )
  750. elif crawler == "zmyx":
  751. content = "众妙音信爬虫表"
  752. sheet_url = (
  753. "https://w42nne6hzg.feishu.cn/sheets/shtcnbZIxstPeM0xshW07b26sve"
  754. )
  755. users = (
  756. "\n<at id="
  757. + str(cls.get_userid(log_type, crawler, "wangkun"))
  758. + "></at> <at id="
  759. + str(cls.get_userid(log_type, crawler, "gaonannan"))
  760. + "></at>\n"
  761. )
  762. elif crawler == "zhufumao":
  763. content = "祝福猫视频爬虫表"
  764. sheet_url = (
  765. "https://w42nne6hzg.feishu.cn/sheets/shtcnXfIJthvkjhI5zlEJq84i6g"
  766. )
  767. users = (
  768. "\n<at id="
  769. + str(cls.get_userid(log_type, crawler, "wangkun"))
  770. + "></at> <at id="
  771. + str(cls.get_userid(log_type, crawler, "gaonannan"))
  772. + "></at>\n"
  773. )
  774. elif crawler == "kuaishou_follow":
  775. content = "快手_用户主页_已下载表"
  776. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnICEfaw9llDNQkKgdymM1xf?sheet=fYdA8F"
  777. users = (
  778. "\n<at id="
  779. + str(cls.get_userid(log_type, crawler, "wangkun"))
  780. + "></at> <at id="
  781. + str(cls.get_userid(log_type, crawler, "xinxin"))
  782. + "></at>\n"
  783. )
  784. elif crawler == "kuaishou_recommend":
  785. content = "快手_推荐榜_已下载表"
  786. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnICEfaw9llDNQkKgdymM1xf?sheet=3cd128"
  787. users = (
  788. "\n<at id="
  789. + str(cls.get_userid(log_type, crawler, "wangkun"))
  790. + "></at> <at id="
  791. + str(cls.get_userid(log_type, crawler, "xinxin"))
  792. + "></at>\n"
  793. )
  794. elif crawler == "ssnnyfq":
  795. content = "岁岁年年迎福气_已下载表"
  796. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnyJmJSJynHDLLbLTkySfvZe?sheet=290bae"
  797. users = (
  798. "\n<at id="
  799. + str(cls.get_userid(log_type, crawler, "wangkun"))
  800. + "></at> <at id="
  801. + str(cls.get_userid(log_type, crawler, "xinxin"))
  802. + "></at>\n"
  803. )
  804. elif crawler == "kdjsfq":
  805. content = "看到就是福气_已下载表"
  806. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnEokBkIjOUPAk8vbbPKnXgb?sheet=ad3b6d"
  807. users = (
  808. "\n<at id="
  809. + str(cls.get_userid(log_type, crawler, "wangkun"))
  810. + "></at> <at id="
  811. + str(cls.get_userid(log_type, crawler, "xinxin"))
  812. + "></at>\n"
  813. )
  814. elif crawler == "gzh":
  815. content = "公众号爬虫表"
  816. sheet_url = (
  817. "https://w42nne6hzg.feishu.cn/sheets/shtcnexNXnpDLHhARw0QdiwbYuA"
  818. )
  819. users = (
  820. "\n<at id="
  821. + str(cls.get_userid(log_type, crawler, "wangkun"))
  822. + "></at> <at id="
  823. + str(cls.get_userid(log_type, crawler, "huxinxue"))
  824. + "></at>\n"
  825. )
  826. elif crawler == "gongzhonghao":
  827. content = "公众号_信欣_爬虫表"
  828. sheet_url = (
  829. "https://w42nne6hzg.feishu.cn/sheets/shtcna98M2mX7TbivTj9Sb7WKBN?"
  830. )
  831. users = f"\n<at id={str(cls.get_userid(log_type, crawler, 'huxinxue'))}></at> <at id={str(cls.get_userid(log_type, crawler, 'wangxueke'))}></at> <at id={str(cls.get_userid(log_type, crawler, 'xinxin'))}></at>\n"
  832. elif crawler == "weiqun":
  833. content = "微群爬虫表"
  834. sheet_url = (
  835. "https://w42nne6hzg.feishu.cn/sheets/shtcnoKThNquYRweaylMFVyo9Hc"
  836. )
  837. users = (
  838. "\n<at id="
  839. + str(cls.get_userid(log_type, crawler, "wangkun"))
  840. + "></at> <at id="
  841. + str(cls.get_userid(log_type, crawler, "xinxin"))
  842. + "></at>\n"
  843. )
  844. elif crawler == "weishi":
  845. content = "微视爬虫表"
  846. sheet_url = (
  847. "https://w42nne6hzg.feishu.cn/sheets/shtcn5YSWg91JfVGzj0SFZIRRPh"
  848. )
  849. users = (
  850. "\n<at id="
  851. + str(cls.get_userid(log_type, crawler, "wangkun"))
  852. + "></at> <at id="
  853. + str(cls.get_userid(log_type, crawler, "xinxin"))
  854. + "></at>\n"
  855. )
  856. elif crawler == "shipinhao_recommend":
  857. content = "视频号_推荐_已下载表"
  858. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcn9rOdZRAGFbRkWpn7hqEHGc?sheet=c77cf9"
  859. users = (
  860. "\n<at id="
  861. + str(cls.get_userid(log_type, crawler, "wangkun"))
  862. + "></at> <at id="
  863. + str(cls.get_userid(log_type, crawler, "wuchaoyue"))
  864. + "></at>\n"
  865. )
  866. elif crawler == "shipinhao_follow":
  867. content = "视频号_定向_已下载表"
  868. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcn9rOdZRAGFbRkWpn7hqEHGc?sheet=KsVtLe"
  869. users = (
  870. "\n<at id="
  871. + str(cls.get_userid(log_type, crawler, "wangkun"))
  872. + "></at> <at id="
  873. + str(cls.get_userid(log_type, crawler, "wuchaoyue"))
  874. + "></at>\n"
  875. )
  876. elif crawler == "youtube":
  877. content = "youtube_定向_已下载表"
  878. sheet_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnrLyr1zbYbhhZyqpN7Xrd5f?sheet=GVxlYk"
  879. users = (
  880. "\n<at id="
  881. + str(cls.get_userid(log_type, crawler, "wangkun"))
  882. + "></at> <at id="
  883. + str(cls.get_userid(log_type, crawler, "wuchaoyue"))
  884. + "></at>\n"
  885. )
  886. elif crawler == "zongjiao":
  887. content = "宗教公众号爬虫表"
  888. sheet_url = (
  889. "https://w42nne6hzg.feishu.cn/sheets/shtcn73NW0CyoOeF21HWO15KBsb"
  890. )
  891. users = (
  892. "\n<at id="
  893. + str(cls.get_userid(log_type, crawler, "wangkun"))
  894. + "></at> <at id="
  895. + str(cls.get_userid(log_type, crawler, "huxinxue"))
  896. + "></at>\n"
  897. )
  898. else:
  899. content = "小年糕爬虫表"
  900. sheet_url = (
  901. "https://w42nne6hzg.feishu.cn/sheets/shtcnYxiyQ1wLklo1W5Kdqc9cGh"
  902. )
  903. users = (
  904. "\n<at id="
  905. + str(cls.get_userid(log_type, crawler, "wangkun"))
  906. + "></at>\n"
  907. )
  908. data = json.dumps(
  909. {
  910. "msg_type": "interactive",
  911. "card": {
  912. "config": {"wide_screen_mode": True, "enable_forward": True},
  913. "elements": [
  914. {
  915. "tag": "div",
  916. "text": {"content": users + text, "tag": "lark_md"},
  917. },
  918. {
  919. "actions": [
  920. {
  921. "tag": "button",
  922. "text": {"content": content, "tag": "lark_md"},
  923. "url": sheet_url,
  924. "type": "default",
  925. "value": {},
  926. }
  927. ],
  928. "tag": "action",
  929. },
  930. ],
  931. "header": {
  932. "title": {"content": "📣您有新的信息,请注意查收", "tag": "plain_text"}
  933. },
  934. },
  935. }
  936. )
  937. urllib3.disable_warnings()
  938. r = requests.post(
  939. url, headers=headers, data=data, verify=False, proxies=proxies
  940. )
  941. Common.logger(log_type, crawler).info(f"触发机器人消息:{r.status_code}, {text}")
  942. except Exception as e:
  943. Common.logger(log_type, crawler).error(f"bot异常:{e}\n")
  944. if __name__ == "__main__":
  945. Feishu.bot("recommend", "xigua", "测试: 西瓜推荐,登录失效")
  946. # print(Feishu.get_userid('bot', 'weixinzhishu', 'wangkun'))
  947. # print(Feishu.get_userid('bot', 'weixinzhishu', 'yuzhuoyi'))