base_utils_ql_create_tasks.py 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import requests
  4. # 青龙面板的地址
  5. url = "https://auto.erhe.top"
  6. # 登录青龙面板
  7. def login():
  8. response = requests.post(f"{url}/api/user/login", json={"username": "toor", "password": "!QAZ2wsx+0913"})
  9. print(response)
  10. if response.status_code != 200:
  11. print(response.status_code)
  12. print(response.text)
  13. exit(0)
  14. return response.json()['data']['token']
  15. # 获取任务列表
  16. def get_tasks(token):
  17. response = requests.get(f"{url}/api/crons", headers={"Authorization": f"Bearer {token}"})
  18. return response.json()['data']['data']
  19. # 创建任务
  20. def create_task(task_template, token):
  21. payload = {
  22. "name": task_template["name"],
  23. "command": task_template["command"],
  24. "schedule": task_template["schedule"],
  25. "labels": task_template["labels"]
  26. }
  27. headers = {
  28. "Authorization": f"Bearer {token}",
  29. "Content-Type": "application/json"
  30. }
  31. response = requests.post(f"{url}/api/crons", headers=headers, json=payload)
  32. return response.json()
  33. # 创建视图分类
  34. def create_view_type(token):
  35. view_type_list = ['base', 'spider_common']
  36. for view_type in view_type_list:
  37. payload = {
  38. "name": view_type,
  39. "filters": {
  40. 'property': 'labels',
  41. 'operation': 'Reg',
  42. 'value': view_type
  43. },
  44. 'filterRelation': 'and'
  45. }
  46. headers = {
  47. "Authorization": f"Bearer {token}",
  48. "Content-Type": "application/json"
  49. }
  50. response = requests.post(f"{url}/api/crons", headers=headers, json=payload)
  51. # 主逻辑
  52. def main():
  53. while True:
  54. try:
  55. token = login()
  56. print(f"已连接到 {url}")
  57. tasks = get_tasks(token)
  58. tasks_names = [task['name'] for task in tasks]
  59. if tasks:
  60. print("Current tasks name: \n{}, \ntotal: {}".format('\n'.join(tasks_names), str(len(tasks_names))))
  61. else:
  62. print("Tasks list is empty")
  63. project_path = '/ql/data/scripts/auto/'
  64. base_path = os.path.join(project_path, 'base')
  65. spider_path = os.path.join(project_path, 'spider')
  66. message_path = os.path.join(project_path, 'message')
  67. manual_path = os.path.join(project_path, 'manual')
  68. daily_path = os.path.join(project_path, 'daily')
  69. tasks_template = [{
  70. 'base_tasks': [
  71. {
  72. "name": "每天开始自动创建日志",
  73. "command": "python3 {}/base_daily_logs_generate.py".format(base_path),
  74. "schedule": "0 0 * * *",
  75. "labels": ["base"]
  76. },
  77. {
  78. "name": "每天结束自动发送日志",
  79. "command": "python3 {}/base_daily_logs_send.py".format(base_path),
  80. "schedule": "58 23 * * *",
  81. "labels": ["base"]
  82. },
  83. {
  84. "name": "每天自动删除旧数据",
  85. "command": "python3 {}/base_timing_remove_data.py".format(base_path),
  86. "schedule": "1 0 * * *",
  87. "labels": ["base"]
  88. },
  89. {
  90. "name": "每天新闻汇总,发送到邮箱",
  91. "command": "python3 {}/base_news_data_collation.py".format(base_path),
  92. "schedule": "0 10 6,12,18 * * *",
  93. "labels": ["base"]
  94. },
  95. {
  96. "name": "定时刷新 freshrss 订阅源",
  97. "command": "python3 {}/update_feed.py".format(base_path),
  98. "schedule": "0 6,22 * * *",
  99. "labels": ["base"]
  100. }
  101. ],
  102. 'spider': [
  103. {
  104. "name": "自动执行反斗限免爬虫",
  105. "command": "python3 {}/news_get_apprcn.py".format(spider_path),
  106. "schedule": "0 0 3,6,9,12,15,18,21 * * *",
  107. "labels": ["spider"]
  108. },
  109. {
  110. "name": "自动执行chiphell爬虫",
  111. "command": "python3 {}/news_get_chiphell.py".format(spider_path),
  112. "schedule": "0 0 3,6,9,12,15,18,21 * * *",
  113. "labels": ["spider"]
  114. },
  115. {
  116. "name": "自动执行hello_github爬虫",
  117. "command": "python3 {}/news_get_hello_github.py".format(spider_path),
  118. "schedule": "0 0 3,6,9,12,15,18,21 * * *",
  119. "labels": ["spider"]
  120. },
  121. {
  122. "name": "自动执行Anyknew爬虫",
  123. "command": "python3 {}/news_get_news.py".format(spider_path),
  124. "schedule": "0 0 3,6,9,12,15,18,21 * * *",
  125. "labels": ["spider"]
  126. },
  127. {
  128. "name": "自动执行币界网文章爬虫",
  129. "command": "python3 {}/spider_web3_coin_world.py".format(spider_path),
  130. "schedule": "0 0 3,6,9,12,15,18,21 * * *",
  131. "labels": ["spider"]
  132. },
  133. {
  134. "name": "获取 web3 新闻",
  135. "command": "python3 {}/spider_web3_news.py".format(spider_path),
  136. "schedule": "0 0 3,6,9,12,15,18,21 * * *",
  137. "labels": ["spider"]
  138. },
  139. {
  140. "name": "自动执行dlt爬虫",
  141. "command": "python3 {}/spider_get_and_check_dlt.py".format(spider_path),
  142. "schedule": "30 22 * * 1,3,6",
  143. "labels": ["spider"]
  144. }
  145. ],
  146. 'message_tasks': [
  147. {
  148. "name": "获取coin实时数据",
  149. "command": "python3 {}/message_coin_detail.py".format(message_path),
  150. "schedule": "0 * * * *",
  151. "labels": ["message"]
  152. },
  153. {
  154. "name": "对比大乐透最新一期数据,匹配已购买号码,发送消息",
  155. "command": "python3 {}/message_dlt.py".format(message_path),
  156. "schedule": "30 22 * * 1,3,6",
  157. "labels": ["message"]
  158. },
  159. {
  160. "name": "获取未来 7 天的天气预报",
  161. "command": "python3 {}/message_get_one_week_weather.py".format(message_path),
  162. "schedule": "0 0 6,22 * * *",
  163. "labels": ["message"]
  164. },
  165. {
  166. "name": "从 freshrss-psql 数据库中读取数据并发送",
  167. "command": "python3 {}/message_rss_data_handel.py".format(message_path),
  168. "schedule": "30 6,9,12,18,22 * * *",
  169. "labels": ["message"]
  170. },
  171. {
  172. "name": "空投任务消息",
  173. "command": "python3 {}/message_airdrop_tasks.py".format(message_path),
  174. "schedule": "0 8,20 * * *",
  175. "labels": ["message"]
  176. },
  177. {
  178. "name": "链捕手快讯消息推送",
  179. "command": "python3 {}/message_chaincatcher.py".format(message_path),
  180. "schedule": "0 */2 * * *",
  181. "labels": ["message"]
  182. }
  183. ],
  184. 'manual': [
  185. {
  186. "name": "手动读取rss订阅新闻",
  187. "command": "python3 {}/read_news.py".format(manual_path),
  188. "schedule": "0 0 1 1 *",
  189. "labels": ["manual"]
  190. }
  191. ],
  192. 'daily': [
  193. {
  194. "name": "3dos自动签到",
  195. "command": "python3 {}/daily_3dos.py".format(daily_path),
  196. "schedule": "*/5 * * * *",
  197. "labels": ["daily"]
  198. }
  199. ],
  200. }]
  201. for task_template in tasks_template:
  202. for task_type, task_list in task_template.items():
  203. for task in task_list:
  204. task_name = task["name"]
  205. if task_name in tasks_names:
  206. print("Task {} already exists.".format(task_name))
  207. else:
  208. result = create_task(task, token)
  209. print("Task creation result:", result)
  210. # 创建所有任务之后, 创建视图分类
  211. # create_view_type(token)
  212. break # 正常执行完成后退出循环
  213. except Exception as e:
  214. print("An error occurred: ", e)
  215. print("Retrying...")
  216. if __name__ == "__main__":
  217. main()
  218. print('done!')