Browse Source

重构

pull/15/head
yuxian158 3 years ago
parent
commit
ebeffb0b72
  1. 67
      README.md
  2. 292
      check.sample.json
  3. 0
      check.sample.toml
  4. 731
      checksendNotify.py
  5. 35
      ck_163game.py
  6. 150
      ck_acfun.py
  7. 59
      ck_baidu_url_submit.py
  8. 345
      ck_bilibili.py
  9. 159
      ck_cloud189.py
  10. 63
      ck_csdn.py
  11. 368
      ck_duokan.py
  12. 104
      ck_fmapp.py
  13. 115
      ck_hlx.py
  14. 219
      ck_iqiyi.py
  15. 139
      ck_kgqq.py
  16. 102
      ck_meizu.py
  17. 68
      ck_mgtv.py
  18. 114
      ck_mimotion.py
  19. 76
      ck_smzdm.py
  20. 328
      ck_vqq.js
  21. 51
      ck_wzyd.py
  22. 265
      config.json
  23. 18
      getENV.py
  24. 245
      utils.py

67
README.md

@ -32,51 +32,78 @@
> ***您使用或者复制了本仓库且本人制作的任何脚本,则视为 `已接受` 此声明,请仔细阅读*** > ***您使用或者复制了本仓库且本人制作的任何脚本,则视为 `已接受` 此声明,请仔细阅读***
## 支持的签到列表
可以在各文件夹查看
#### 1.dailycheckin_scripts:
该文件夹下是https://github.com/sitoi/dailycheckin该项目的全部支持脚本[具体查看](https://github.com/yuxian158/check/dailycheckin_scripts/README.md)
## 使用方法 ## 使用方法
**进入容器后运行以下命令**(docker exec -it ql bash)修改ql为你的青龙容器名字
以下命令全部都是进入容器后输入
### 1.拉取仓库 ### 1.拉取仓库
**进入容器后运行以下命令**(docker exec -it ql bash)修改ql为你的青龙容器名字 只使用dailycheckin_scripts:
``` ```
pip3 install requests rsa ql repo https://github.com/yuxian158/check.git "ck_" "" "checksend|utils"
ql repo https://github.com/yuxian158/check.git "ck_" "" "checksendNotify|getENV"
cp /ql/repo/yuxian158_check/config.json /ql/config/check.json
``` ```
### 2.配置 只使用others_scripts:
```
ql repo https://github.com/yuxian158/check.git "oc_" "" "checksend|utils"
```
然后不出意外的话你可以在青龙面板的配置文件下找到check.json文件 我全都要:
然后根据原文档修改配置[这里](https://sitoi.gitee.io/dailycheckin/settings/) ```
ql repo https://github.com/yuxian158/check.git "" "" "checksend|utils"
```
## 修改说明 ### 2.配置
### 1.**添加了葫芦侠的签到配置** ```
cp /ql/repo/yuxian158_check/check.sample.toml /ql/config/check.toml
```
参数说明:`HLX.user`:用户名 `HLX.password`:密码的MD532位小写加密[生成](https://md5jiami.bmcx.com/) 或使用json格式(不推荐)
```
cp /ql/repo/yuxian158_check/check.sample.json /ql/config/check.json
```
### 2。**添加了网易云游戏的签到配置** 然后不出意外的话你可以在青龙面板的配置文件下找到check.toml或check.json文件
[官网](https://cg.163.com/#/mobile) 然后根据文件夹下REDEME修改配置[这里](https://sitoi.gitee.io/dailycheckin/settings/)
参数说明:`163game.Authorization` ### 3.说明
登录后抓取签到请求(一般请求的请求头也有这个字段) 1.本仓库在12.21日的更新中同时支持了json和toml两种格式的配置文件,但是推荐使用toml格式配置文件
[![fMdyEq.png](https://z3.ax1x.com/2021/08/07/fMdyEq.png)](https://imgtu.com/i/fMdyEq) 2.当toml和json配置文件共存时优先使用toml文件
## 其他说明 ### 4.其他
1.本库直接使用了青龙的通知配置 #### 1.关于 toml 的语法参考:
2.请自行修改执行时间 * [toml-lang/toml](https://github.com/toml-lang/toml)
* [中文知乎介绍](https://zhuanlan.zhihu.com/p/50412485)
* [TOML 教程中文版](https://toml.io/cn/v1.0.0)
#### 2.排错指引
1.在sitoi/dailycheckin的某次更新中修改了键名,请尽量删除原配置文件后重新配置
2.本库找配置文件时使用了正则表达式,在最外层配置时可以不区分大小写,且只要包含字段就可以,甚至可以写中文(强烈不建议这么写,貌似toml不支持)
3.很多脚本并没有测试
4.本库所有脚本都未加运行时间提示,可以拉取后所有脚本运行时间都一样
## 致谢 ## 致谢
[@Wenmoux](https://github.com/Wenmoux/) [@Wenmoux](https://github.com/Wenmoux/)
[@MayoBlueSky](https://github.com/MayoBlueSky)
[@Sitoi](https://github.com/Sitoi) [@Sitoi](https://github.com/Sitoi)
[@Oreomeow](https://github.com/Oreomeow)

292
check.sample.json

@ -0,0 +1,292 @@
{
"IQIYI": [
{
"cookie": "__dfp=xxxxxx; QP0013=xxxxxx; QP0022=xxxxxx; QYABEX=xxxxxx; P00001=xxxxxx; P00002=xxxxxx; P00003=xxxxxx; P00007=xxxxxx; QC163=xxxxxx; QC175=xxxxxx; QC179=xxxxxx; QC170=xxxxxx; P00010=xxxxxx; P00PRU=xxxxxx; P01010=xxxxxx; QC173=xxxxxx; QC180=xxxxxx; P00004=xxxxxx; QP0030=xxxxxx; QC006=xxxxxx; QC007=xxxxxx; QC008=xxxxxx; QC010=xxxxxx; nu=xxxxxx; __uuid=xxxxxx; QC005=xxxxxx;"
},
{
"cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"VQQ": [
{
"auth_refresh": "https://access.video.qq.com/user/auth_refresh?vappid=xxxxxx&vsecret=xxxxxx&type=qq&g_tk=&g_vstk=xxxxxx&g_actk=xxxxxx&callback=xxxxxx&_=xxxxxx",
"cookie": "pgv_pvid=xxxxxx; pac_uid=xxxxxx; RK=xxxxxx; ptcz=xxxxxx; tvfe_boss_uuid=xxxxxx; video_guid=xxxxxx; video_platform=xxxxxx; pgv_info=xxxxxx; main_login=xxxxxx; vqq_access_token=xxxxxx; vqq_appid=xxxxxx; vqq_openid=xxxxxx; vqq_vuserid=xxxxxx; vqq_refresh_token=xxxxxx; login_time_init=xxxxxx; uid=xxxxxx; vqq_vusession=xxxxxx; vqq_next_refresh_time=xxxxxx; vqq_login_time_init=xxxxxx; login_time_last=xxxxxx;"
},
{
"auth_refresh": "多账号 refresh url,请参考上面,以实际获取为准",
"cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"YOUDAO": [
{
"cookie": "JSESSIONID=xxxxxx; __yadk_uid=xxxxxx; OUTFOX_SEARCH_USER_ID_NCOO=xxxxxx; YNOTE_SESS=xxxxxx; YNOTE_PERS=xxxxxx; YNOTE_LOGIN=xxxxxx; YNOTE_CSTK=xxxxxx; _ga=xxxxxx; _gid=xxxxxx; _gat=xxxxxx; PUBLIC_SHARE_18a9dde3de846b6a69e24431764270c4=xxxxxx;"
},
{
"cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"KGQQ": [
{
"cookie": "muid=xxxxxx; uid=xxxxxx; userlevel=xxxxxx; openid=xxxxxx; openkey=xxxxxx; opentype=xxxxxx; qrsig=xxxxxx; pgv_pvid=xxxxxx;"
},
{
"cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"MUSIC163": [
{
"password": "Sitoi",
"phone": "18888xxxxxx"
},
{
"password": "多账号 密码",
"phone": "多账号 手机号"
}
],
"ONEPLUSBBS": [
{
"cookie": "acw_tc=xxxxxx; qKc3_0e8d_saltkey=xxxxxx; qKc3_0e8d_lastvisit=xxxxxx; bbs_avatar=xxxxxx; qKc3_0e8d_sendmail=xxxxxx; opcid=xxxxxx; opcct=xxxxxx; oppt=xxxxxx; opsid=xxxxxx; opsct=xxxxxx; opbct=xxxxxx; UM_distinctid=xxxxxx; CNZZDATA1277373783=xxxxxx; www_clear=xxxxxx; ONEPLUSID=xxxxxx; qKc3_0e8d_sid=xxxxxx; bbs_uid=xxxxxx; bbs_uname=xxxxxx; bbs_grouptitle=xxxxxx; opuserid=xxxxxx; bbs_sign=xxxxxx; bbs_formhash=xxxxxx; qKc3_0e8d_ulastactivity=xxxxxx; opsertime=xxxxxx; qKc3_0e8d_lastact=xxxxxx; qKc3_0e8d_checkpm=xxxxxx; qKc3_0e8d_noticeTitle=xxxxxx; optime_browser=xxxxxx; opnt=xxxxxx; opstep=xxxxxx; opstep_event=xxxxxx; fp=xxxxxx;"
},
{
"cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"BAIDU": [
{
"data_url": "https://cdn.jsdelivr.net/gh/Sitoi/Sitoi.github.io/baidu_urls.txt",
"submit_url": "http://data.zz.baidu.com/urls?site=https://sitoi.cn&token=xxxxxx",
"times": 10
},
{
"data_url": "多账号 data_url 链接地址,以实际获取为准",
"submit_url": "多账号 submit_url 链接地址,以实际获取为准",
"times": 10
}
],
"FMAPP": [
{
"blackbox": "eyJlcnJxxxxxx",
"cookie": "sensorsdata2015jssdkcross=xxxxxx",
"device_id": "xxxxxx-xxxx-xxxx-xxxx-xxxxxx",
"fmversion": "xxxxxx",
"os": "xxxxxx",
"token": "xxxxxx.xxxxxx-xxxxxx-xxxxxx.xxxxxx-xxxxxx",
"useragent": "xxxxxx"
},
{
"blackbox": "多账号 blackbox 填写,请参考上面,blackbox 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)",
"cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)",
"device_id": "多账号 device_id 填写,请参考上面,以实际获取为准",
"fmversion": "多账号 fmVersion 填写,请参考上面,以实际获取为准",
"os": "多账号 os 填写,请参考上面,以实际获取为准",
"token": "多账号 token 填写,请参考上面,以实际获取为准",
"useragent": "多账号 User-Agent 填写,请参考上面,以实际获取为准"
}
],
"TIEBA": [
{
"cookie": "BIDUPSID=xxxxxx; PSTM=xxxxxx; BAIDUID=xxxxxx; BAIDUID_BFESS=xxxxxx; delPer=xxxxxx; PSINO=xxxxxx; H_PS_PSSID=xxxxxx; BA_HECTOR=xxxxxx; BDORZ=xxxxxx; TIEBA_USERTYPE=xxxxxx; st_key_id=xxxxxx; BDUSS=xxxxxx; BDUSS_BFESS=xxxxxx; STOKEN=xxxxxx; TIEBAUID=xxxxxx; ab_sr=xxxxxx; st_data=xxxxxx; st_sign=xxxxxx;"
},
{
"cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"BILIBILI": [
{
"cookie": "_uuid=xxxxxx; rpdid=xxxxxx; LIVE_BUVID=xxxxxx; PVID=xxxxxx; blackside_state=xxxxxx; CURRENT_FNVAL=xxxxxx; buvid3=xxxxxx; fingerprint3=xxxxxx; fingerprint=xxxxxx; buivd_fp=xxxxxx; buvid_fp_plain=xxxxxx; DedeUserID=xxxxxx; DedeUserID__ckMd5=xxxxxx; SESSDATA=xxxxxx; bili_jct=xxxxxx; bsource=xxxxxx; finger=xxxxxx; fingerprint_s=xxxxxx;",
"coin_num": 0,
"coin_type": 1,
"silver2coin": true
},
{
"cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)",
"coin_num": 0,
"coin_type": 1,
"silver2coin": true
}
],
"V2EX": [
{
"cookie": "_ga=xxxxxx; __cfduid=xxxxxx; PB3_SESSION=xxxxxx; A2=xxxxxx; V2EXSETTINGS=xxxxxx; V2EX_REFERRER=xxxxxx; V2EX_LANG=xxxxxx; _gid=xxxxxx; V2EX_TAB=xxxxxx;",
"proxy": "使用代理的信息,无密码例子: http://127.0.0.1:1080 有密码例子: http://username:password@127.0.0.1:1080"
},
{
"cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)",
"proxy": "使用代理的信息,无密码例子: http://127.0.0.1:1080 有密码例子: http://username:password@127.0.0.1:1080"
}
],
"WWW2NZZ": [
{
"cookie": "YPx9_2132_saltkey=xxxxxx; YPx9_2132_lastvisit=xxxxxx; YPx9_2132_sendmail=xxxxxx; YPx9_2132_con_request_uri=xxxxxx; YPx9_2132_sid=xxxxxx; YPx9_2132_client_created=xxxxxx; YPx9_2132_client_token=xxxxxx; YPx9_2132_ulastactivity=xxxxxx; YPx9_2132_auth=xxxxxx; YPx9_2132_connect_login=xxxxxx; YPx9_2132_connect_is_bind=xxxxxx; YPx9_2132_connect_uin=xxxxxx; YPx9_2132_stats_qc_login=xxxxxx; YPx9_2132_checkpm=xxxxxx; YPx9_2132_noticeTitle=xxxxxx; YPx9_2132_nofavfid=xxxxxx; YPx9_2132_lastact=xxxxxx;"
},
{
"cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"SMZDM": [
{
"cookie": "__jsluid_s=xxxxxx; __ckguid=xxxxxx; device_id=xxxxxx; homepage_sug=xxxxxx; r_sort_type=xxxxxx; _zdmA.vid=xxxxxx; sajssdk_2015_cross_new_user=xxxxxx; sensorsdata2015jssdkcross=xxxxxx; footer_floating_layer=xxxxxx; ad_date=xxxxxx; ad_json_feed=xxxxxx; zdm_qd=xxxxxx; sess=xxxxxx; user=xxxxxx; _zdmA.uid=xxxxxx; smzdm_id=xxxxxx; userId=xxxxxx; bannerCounter=xxxxxx; _zdmA.time=xxxxxx;"
},
{
"cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"MIMOTION": [
{
"max_step": "20000",
"min_step": "10000",
"password": "Sitoi",
"phone": "18888xxxxxx"
},
{
"max_step": "多账号 最大步数填写,请参考上面",
"min_step": "多账号 最小步数填写,请参考上面",
"password": "多账号 密码填写,请参考上面",
"phone": "多账号 手机号填写,请参考上面"
}
],
"ACFUN": [
{
"password": "Sitoi",
"phone": "18888xxxxxx"
},
{
"password": "多账号 密码填写,请参考上面",
"phone": "多账号 手机号填写,请参考上面"
}
],
"CLOUD189": [
{
"password": "Sitoi",
"phone": "18888xxxxxx"
},
{
"password": "多账号 密码填写,请参考上面",
"phone": "多账号 手机号填写,请参考上面"
}
],
"POJIE": [
{
"cookie": "htVD_2132_client_token=xxxxxx; htVD_2132_connect_is_bind=xxxxxx; htVD_2132_connect_uin=xxxxxx; htVD_2132_nofavfid=xxxxxx; htVD_2132_smile=xxxxxx; Hm_lvt_46d556462595ed05e05f009cdafff31a=xxxxxx; htVD_2132_saltkey=xxxxxx; htVD_2132_lastvisit=xxxxxx; htVD_2132_client_created=xxxxxx; htVD_2132_auth=xxxxxx; htVD_2132_connect_login=xxxxxx; htVD_2132_home_diymode=xxxxxx; htVD_2132_visitedfid=xxxxxx; htVD_2132_viewid=xxxxxx; KF4=xxxxxx; htVD_2132_st_p=xxxxxx; htVD_2132_lastcheckfeed=xxxxxx; htVD_2132_sid=xxxxxx; htVD_2132_ulastactivity=xxxxxx; htVD_2132_noticeTitle=xxxxxx;"
},
{
"cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"MGTV": [
{
"params": "uuid=xxxxxx&uid=xxxxxx&ticket=xxxxxx&token=xxxxxx&device=iPhone&did=xxxxxx&deviceId=xxxxxx&appVersion=6.8.2&osType=ios&platform=iphone&abroad=0&aid=xxxxxx&nonce=xxxxxx&timestamp=xxxxxx&appid=xxxxxx&type=1&sign=xxxxxx&callback=xxxxxx"
},
{
"params": "多账号 请求参数填写,请参考上面"
}
],
"PICACOMIC": [
{
"email": "Sitoi",
"password": "xxxxxx"
},
{
"email": "多账号 账号填写,请参考上面",
"password": "多账号 密码填写,请参考上面"
}
],
"MEIZU": [
{
"draw_count": "1",
"cookie": "aliyungf_tc=xxxxxx; logined_uid=xxxxxx; acw_tc=xxxxxx; LT=xxxxxx; MZBBS_2132_saltkey=xxxxxx; MZBBS_2132_lastvisit=xxxxxx; MZBBSUC_2132_auth=xxxxxx; MZBBSUC_2132_loginmember=xxxxxx; MZBBSUC_2132_ticket=xxxxxx; MZBBS_2132_sid=xxxxxx; MZBBS_2132_ulastactivity=xxxxxx; MZBBS_2132_auth=xxxxxx; MZBBS_2132_loginmember=xxxxxx; MZBBS_2132_lastcheckfeed=xxxxxx; MZBBS_2132_checkfollow=xxxxxx; MZBBS_2132_lastact=xxxxxx;"
},
{
"draw_count": "多账号 抽奖次数设置",
"cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"ZHIYOO": [
{
"cookie": "ikdQ_9242_saltkey=xxxxxx; ikdQ_9242_lastvisit=xxxxxx; ikdQ_9242_onlineusernum=xxxxxx; ikdQ_9242_sendmail=1; ikdQ_9242_seccode=xxxxxx; ikdQ_9242_ulastactivity=xxxxxx; ikdQ_9242_auth=xxxxxx; ikdQ_9242_connect_is_bind=xxxxxx; ikdQ_9242_nofavfid=xxxxxx; ikdQ_9242_checkpm=xxxxxx; ikdQ_9242_noticeTitle=1; ikdQ_9242_sid=xxxxxx; ikdQ_9242_lip=xxxxxx; ikdQ_9242_lastact=xxxxxx"
},
{
"cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"WEIBO": [
{
"url": "https://api.weibo.cn/2/users/show?wm=xxxxxx&launchid=xxxxxx&b=xxxxxx&from=xxxxxx&c=xxxxxx&networktype=xxxxxx&v_p=xxxxxx&skin=xxxxxx&v_f=xxxxxx&lang=xxxxxx&sflag=xxxxxx&ua=xxxxxx&ft=xxxxxx&aid=xxxxxx&has_extend=xxxxxx&uid=xxxxxx&gsid=xxxxxx&sourcetype=&get_teenager=xxxxxx&s=xxxxxx&has_profile=xxxxxx"
},
{
"url": "多账号 show_url 填写,请参考上面,show_url 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"DUOKAN": [
{
"cookie": "user_id=xxxxxx; token=xxxxxx; user_gender=xxxxxx; device_id=xxxxxx; app_id=xxxxxx; build=xxxxxx; short_version=xxxxxx"
},
{
"cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"CSDN": [
{
"cookie": "uuid_tt_dd=xxxxxx; _ga=xxxxxx; UserName=xxxxxx; UserInfo=xxxxxx; UserToken=xxxxxx; UserNick=xxxxxx; AU=768; UN=xxxxxx; BT=xxxxxx; p_uid=xxxxxx; Hm_up_6bcd52f51e9b3dce32bec4a3997715ac=xxxxxx; Hm_ct_6bcd52f51e9b3dce32bec4a3997715ac=xxxxxx; Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac=xxxxxx dc_sid=xxxxxx; c_segment=xxxxxx; dc_session_id=xxxxxx; csrfToken=xxxxxx; c_first_ref=xxxxxx; c_first_page=xxxxxx; c_page_id=xxxxxx; announcement-new=xxxxxx; log_Id_click=xxxxxx; c_pref=xxxxxx; c_ref=xxxxxx; dc_tos=xxxxxx; log_Id_pv=xxxxxx; log_Id_view=xxxxxx"
},
{
"cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"WZYD": [
{
"data": "areaId=xxxxxx&roleId=xxxxxx&gameId=xxxxxx&serverId=xxxxxx&gameOpenid=xxxxxx&userId=xxxxxx&appVersion=xxxxxx&cClientVersionName=xxxxxx&platid=xxxxxx&source=xxxxxx&algorithm=xxxxxx&version=xxxxxx&timestamp=xxxxxx&appid=xxxxxx&openid=xxxxxx&sig=xxxxxx&encode=2&msdkEncodeParam=xxxxxx&cSystem=xxxxxx&h5Get=xxxxxx&msdkToken=&appOpenid=xxxxxx"
},
{
"data": "多账号 data 填写,请参考上面,data 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"WOMAIL": [
{
"url": "https://nyan.mail.wo.cn/cn/sign/index/index?mobile=xxxxxx&userName=&openId=xxxxxx",
"pause21days": true,
"password": "Sitoi",
"phone": "18888xxxxxx"
},
{
"url": "多账号 url 填写,请参考上面,url 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)",
"pause21days": true,
"password": "多账号 密码填写,请参考上面",
"phone": "多账号 手机号填写,请参考上面"
}
],
"HEYTAP": [
{
"cookie": "sa_distinct_id=xxxxxx;Personalized=xxxxxx;s_channel=xxxxxx;source_type=xxxxxx;app_param=xxxxxx;ENCODE_TOKENSID=xxxxxx;scene_id=xxxxxx;apkPkg=xxxxxx;exp_id=;app_utm=xxxxxx;TOKENSID=xxxxxx;strategy_id=xxxxxx;referer=;experiment_id=xxxxxx;section_id=;s_version=xxxxxx;app_innerutm=xxxxxx;retrieve_id=;log_id=;",
"useragent": "xxxxxx",
"draw": false
},
{
"cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)",
"useragent": "多账号 User-Agent 填写,请参考上面,以实际获取为准",
"draw": false
}
],
"UNICOM": [
{
"mobile": "18888xxxxxx",
"password": "xxxxxx",
"app_id": "xxxxxx"
},
{
"mobile": "多账号 手机号",
"password": "多账号 密码",
"app_id": "多账号 appId"
}
],
"EVERPHOTO": [
{
"mobile": "+8618888xxxxxx",
"password": "xxxxxx"
},
{
"mobile": "多账号 手机号",
"password": "多账号 密码"
}
]
}

0
check.sample.toml

731
checksendNotify.py

@ -1,285 +1,352 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# _*_ coding:utf-8 _*_ # _*_ coding:utf-8 _*_
import base64
import sys import hashlib
import os, re import hmac
cur_path = os.path.abspath(os.path.dirname(__file__))
root_path = os.path.split(cur_path)[0]
sys.path.append(root_path)
import requests
import json import json
import os
import re
import threading
import time import time
import hmac
import hashlib
import base64
import urllib.parse import urllib.parse
from requests.adapters import HTTPAdapter
from urllib3.util import Retry import requests
# 原先的 print 函数和主线程的锁
_print = print
mutex = threading.Lock()
# 定义新的 print 函数
def print(text, *args, **kw):
"""
使输出有序进行不出现多线程同一时间输出导致错乱的问题
"""
with mutex:
_print(text, *args, **kw)
# 通知服务 # 通知服务
BARK = '' # bark服务,自行搜索;,此参数如果以http或者https开头则判定为自建bark服务;secrets可填; # fmt: off
SCKEY = '' # Server酱的SCKEY; secrets可填 push_config = {
TG_BOT_TOKEN = '' # tg机器人的TG_BOT_TOKEN; secrets可填1407203283:AAG9rt-6RDaaX0HBLZQq0laNOh898iFYaRQ 'HITOKOTO': True, # 启用一言(随机句子)
TG_USER_ID = '' # tg机器人的TG_USER_ID; secrets可填 1434078534
TG_API_HOST = '' # tg 代理api 'BARK_PUSH': '', # bark IP 或设备码,例:https://api.day.app/DxHcxxxxxRxxxxxxcm/
TG_PROXY_IP = '' # tg机器人的TG_PROXY_IP; secrets可填 'BARK_ARCHIVE': '', # bark 推送是否存档
TG_PROXY_PORT = '' # tg机器人的TG_PROXY_PORT; secrets可填 'BARK_GROUP': '', # bark 推送分组
DD_BOT_ACCESS_TOKEN = '' # 钉钉机器人的DD_BOT_ACCESS_TOKEN; secrets可填 'BARK_SOUND': '', # bark 推送声音
DD_BOT_SECRET = '' # 钉钉机器人的DD_BOT_SECRET; secrets可填
QQ_SKEY = '' # qq机器人的QQ_SKEY; secrets可填 'CONSOLE': False, # 控制台输出
QQ_MODE = '' # qq机器人的QQ_MODE; secrets可填
QYWX_AM = '' # 企业微信 'DD_BOT_SECRET': '', # 钉钉机器人的 DD_BOT_SECRET
PUSH_PLUS_TOKEN = '' # 微信推送Plus+ 'DD_BOT_TOKEN': '', # 钉钉机器人的 DD_BOT_TOKEN
GOBOT_URL = "" # go-cqhttp 例如:推送到个人QQ: http://127.0.0.1/send_private_msg 群:http://127.0.0.1/send_group_msg
GOBOT_TOKEN = "" # go-cqhttp的access_token 可不填 'FSKEY': '', # 飞书机器人的 FSKEY
GOBOT_QQ = "" # go-cqhttp的推送群或者用户 GOBOT_URL设置 /send_private_msg 则需要填入 user_id=个人QQ 相反如果是 /send_group_msg 则需要填入 group_id=QQ群
notify_mode = [] 'GOBOT_URL': '', # go-cqhttp
# 推送到个人QQ:http://127.0.0.1/send_private_msg
message_info = '''''' # 群:http://127.0.0.1/send_group_msg
'GOBOT_QQ': '', # go-cqhttp 的推送群或用户
# GitHub action运行需要填写对应的secrets # GOBOT_URL 设置 /send_private_msg 时填入 user_id=个人QQ
if "BARK" in os.environ and os.environ["BARK"]: # /send_group_msg 时填入 group_id=QQ群
BARK = os.environ["BARK"] 'GOBOT_TOKEN': '', # go-cqhttp 的 access_token
if "SCKEY" in os.environ and os.environ["SCKEY"]:
SCKEY = os.environ["SCKEY"] 'GOTIFY_URL': '', # gotify地址,如https://push.example.de:8080
if "TG_BOT_TOKEN" in os.environ and os.environ["TG_BOT_TOKEN"] and "TG_USER_ID" in os.environ and os.environ[ 'GOTIFY_TOKEN': '', # gotify的消息应用token
"TG_USER_ID"]: 'GOTIFY_PRIORITY': 0, # 推送消息优先级,默认为0
TG_BOT_TOKEN = os.environ["TG_BOT_TOKEN"]
TG_USER_ID = os.environ["TG_USER_ID"] 'IGOT_PUSH_KEY': '', # iGot 聚合推送的 IGOT_PUSH_KEY
if "TG_API_HOST" in os.environ and os.environ["TG_API_HOST"]:
TG_API_HOST = os.environ["TG_API_HOST"] 'PUSH_KEY': '', # server 酱的 PUSH_KEY,兼容旧版与 Turbo 版
if "DD_BOT_ACCESS_TOKEN" in os.environ and os.environ["DD_BOT_ACCESS_TOKEN"] and "DD_BOT_SECRET" in os.environ and \
os.environ["DD_BOT_SECRET"]: 'PUSH_PLUS_TOKEN': '', # push+ 微信推送的用户令牌
DD_BOT_ACCESS_TOKEN = os.environ["DD_BOT_ACCESS_TOKEN"] 'PUSH_PLUS_USER': '', # push+ 微信推送的群组编码
DD_BOT_SECRET = os.environ["DD_BOT_SECRET"]
if "QQ_SKEY" in os.environ and os.environ["QQ_SKEY"] and "QQ_MODE" in os.environ and os.environ["QQ_MODE"]: 'QMSG_KEY': '', # qmsg 酱的 QMSG_KEY
QQ_SKEY = os.environ["QQ_SKEY"] 'QMSG_TYPE': '', # qmsg 酱的 QMSG_TYPE
QQ_MODE = os.environ["QQ_MODE"]
# 获取pushplus+ PUSH_PLUS_TOKEN 'QYWX_AM': '', # 企业微信应用
if "PUSH_PLUS_TOKEN" in os.environ:
if len(os.environ["PUSH_PLUS_TOKEN"]) > 1: 'QYWX_KEY': '', # 企业微信机器人
PUSH_PLUS_TOKEN = os.environ["PUSH_PLUS_TOKEN"]
# print("已获取并使用Env环境 PUSH_PLUS_TOKEN") 'TG_BOT_TOKEN': '', # tg 机器人的 TG_BOT_TOKEN,例:1407203283:AAG9rt-6RDaaX0HBLZQq0laNOh898iFYaRQ
# 获取企业微信应用推送 QYWX_AM 'TG_USER_ID': '', # tg 机器人的 TG_USER_ID,例:1434078534
if "QYWX_AM" in os.environ: 'TG_API_HOST': '', # tg 代理 api
if len(os.environ["QYWX_AM"]) > 1: 'TG_PROXY_AUTH': '', # tg 代理认证参数
QYWX_AM = os.environ["QYWX_AM"] 'TG_PROXY_HOST': '', # tg 机器人的 TG_PROXY_HOST
# print("已获取并使用Env环境 QYWX_AM") 'TG_PROXY_PORT': '', # tg 机器人的 TG_PROXY_PORT
# 获取go-cqhttp }
if "GOBOT_URL" in os.environ and os.environ["GOBOT_URL"]: notify_function = []
GOBOT_URL = os.environ["GOBOT_URL"] # fmt: on
GOBOT_TOKEN = os.environ["GOBOT_TOKEN"]
GOBOT_QQ = os.environ["GOBOT_QQ"] # 首先读取 面板变量 或者 github action 运行变量
for k in push_config:
if BARK: if os.getenv(k):
notify_mode.append('bark') v = os.getenv(k)
# print("BARK 推送打开") push_config[k] = v
if SCKEY:
notify_mode.append('sc_key')
# print("Server酱 推送打开") def bark(title: str, content: str) -> None:
if TG_BOT_TOKEN and TG_USER_ID: """
notify_mode.append('telegram_bot') 使用 bark 推送消息
# print("Telegram 推送打开") """
if DD_BOT_ACCESS_TOKEN and DD_BOT_SECRET: if not push_config.get("BARK_PUSH"):
notify_mode.append('dingding_bot') print("bark 服务的 BARK_PUSH 未设置!!\n取消推送")
# print("钉钉机器人 推送打开")
if QQ_SKEY and QQ_MODE:
notify_mode.append('coolpush_bot')
# print("QQ机器人 推送打开")
if GOBOT_URL and GOBOT_QQ:
notify_mode.append('go_cqhttp')
# print("go-cqhttp机器人 推送打开")
if PUSH_PLUS_TOKEN:
notify_mode.append('pushplus_bot')
# print("微信推送Plus机器人 推送打开")
if QYWX_AM:
notify_mode.append('wecom_app')
# print("企业微信机器人 推送打开")
def message(str_msg):
global message_info
print(str_msg)
message_info = "{}\n{}".format(message_info, str_msg)
sys.stdout.flush()
def bark(title, content):
print("\n")
if not BARK:
print("bark服务的bark_token未设置!!\n取消推送")
return return
print("bark 服务启动") print("bark 服务启动")
url = None
if BARK.startswith('http'): if push_config.get("BARK_PUSH").startswith("http"):
url = f"""{BARK}/{title}/{content}""" url = f'{push_config.get("BARK_PUSH")}/{urllib.parse.quote_plus(title)}/{urllib.parse.quote_plus(content)}'
else: else:
url = f"""https://api.day.app/{BARK}/{title}/{content}""" url = f'https://api.day.app/{push_config.get("BARK_PUSH")}/{urllib.parse.quote_plus(title)}/{urllib.parse.quote_plus(content)}'
bark_params = {
"BARK_ARCHIVE": "isArchive",
"BARK_GROUP": "group",
"BARK_SOUND": "sound",
}
params = ""
for pair in filter(
lambda pairs: pairs[0].startswith("BARK_")
and pairs[0] != "BARK_PUSH"
and pairs[1]
and bark_params.get(pairs[0]),
push_config.items(),
):
params += f"{bark_params.get(pair[0])}={pair[1]}&"
if params:
url = url + "?" + params.rstrip("&")
response = requests.get(url).json() response = requests.get(url).json()
if response['code'] == 200:
print('推送成功!') if response["code"] == 200:
print("bark 推送成功!")
else:
print("bark 推送失败!")
def console(title: str, content: str) -> None:
"""
使用 控制台 推送消息
"""
print(f"{title}\n\n{content}")
def dingding_bot(title: str, content: str) -> None:
"""
使用 钉钉机器人 推送消息
"""
if not push_config.get("DD_BOT_SECRET") or not push_config.get("DD_BOT_TOKEN"):
print("钉钉机器人 服务的 DD_BOT_SECRET 或者 DD_BOT_TOKEN 未设置!!\n取消推送")
return
print("钉钉机器人 服务启动")
timestamp = str(round(time.time() * 1000))
secret_enc = push_config.get("DD_BOT_SECRET").encode("utf-8")
string_to_sign = "{}\n{}".format(timestamp, push_config.get("DD_BOT_SECRET"))
string_to_sign_enc = string_to_sign.encode("utf-8")
hmac_code = hmac.new(
secret_enc, string_to_sign_enc, digestmod=hashlib.sha256
).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
url = f'https://oapi.dingtalk.com/robot/send?access_token={push_config.get("DD_BOT_TOKEN")}&timestamp={timestamp}&sign={sign}'
headers = {"Content-Type": "application/json;charset=utf-8"}
data = {"msgtype": "text", "text": {"content": f"{title}\n\n{content}"}}
response = requests.post(
url=url, data=json.dumps(data), headers=headers, timeout=15
).json()
if not response["errcode"]:
print("钉钉机器人 推送成功!")
else:
print("钉钉机器人 推送失败!")
def feishu_bot(title: str, content: str) -> None:
"""
使用 飞书机器人 推送消息
"""
if not push_config.get("FSKEY"):
print("飞书 服务的 FSKEY 未设置!!\n取消推送")
return
print("飞书 服务启动")
url = f'https://open.feishu.cn/open-apis/bot/v2/hook/{push_config.get("FSKEY")}'
data = {"msg_type": "text", "content": {"text": f"{title}\n\n{content}"}}
response = requests.post(url, data=json.dumps(data)).json()
if response.get("StatusCode") == 0:
print("飞书 推送成功!")
else: else:
print('推送失败!') print("飞书 推送失败!错误信息如下:\n", response)
# go-cqhttp def go_cqhttp(title: str, content: str) -> None:
def go_cqhttp(title, content): """
print("\n") 使用 go_cqhttp 推送消息
if not GOBOT_URL or not GOBOT_QQ: """
if not push_config.get("GOBOT_URL") or not push_config.get("GOBOT_QQ"):
print("go-cqhttp 服务的 GOBOT_URL 或 GOBOT_QQ 未设置!!\n取消推送") print("go-cqhttp 服务的 GOBOT_URL 或 GOBOT_QQ 未设置!!\n取消推送")
return return
print("go-cqhttp 服务启动") print("go-cqhttp 服务启动")
url = f"""{GOBOT_URL}?access_token={GOBOT_TOKEN}&{GOBOT_QQ}&message=标题:{title}\n内容:{content}"""
url = f'{push_config.get("GOBOT_URL")}?access_token={push_config.get("GOBOT_TOKEN")}&{push_config.get("GOBOT_QQ")}&message=标题:{title}\n内容:{content}'
response = requests.get(url).json() response = requests.get(url).json()
if response['status'] == 'ok':
print('推送成功!') if response["status"] == "ok":
print("go-cqhttp 推送成功!")
else: else:
print('推送失败!') print("go-cqhttp 推送失败!")
def serverJ(title, content): def gotify(title:str,content:str) -> None:
print("\n") """
if not SCKEY: 使用 gotify 推送消息
print("server酱服务的SCKEY未设置!!\n取消推送") """
if not push_config.get("GOTIFY_URL") or not push_config.get("GOTIFY_TOKEN"):
print("gotify 服务的 GOTIFY_URL 或 GOTIFY_TOKEN 未设置!!\n取消推送")
return return
print("serverJ服务启动") print("gotify 服务启动")
data = {
"text": title, url = f'{push_config.get("GOTIFY_URL")}/message?token={push_config.get("GOTIFY_TOKEN")}'
"desp": content.replace("\n", "\n\n") data = {"title": title,"message": content,"priority": push_config.get("GOTIFY_PRIORITY")}
} response = requests.post(url,data=data).json()
response = requests.post(f"https://sc.ftqq.com/{SCKEY}.send", data=data).json()
if response['errno'] == 0: if response.get("id"):
print('推送成功!') print("gotify 推送成功!")
else: else:
print('推送失败!') print("gotify 推送失败!")
# tg通知 def iGot(title: str, content: str) -> None:
def telegram_bot(title, content): """
try: 使用 iGot 推送消息
print("\n") """
bot_token = TG_BOT_TOKEN if not push_config.get("IGOT_PUSH_KEY"):
user_id = TG_USER_ID print("iGot 服务的 IGOT_PUSH_KEY 未设置!!\n取消推送")
if not bot_token or not user_id:
print("tg服务的bot_token或者user_id未设置!!\n取消推送")
return return
print("tg服务启动") print("iGot 服务启动")
if TG_API_HOST:
url = f"https://{TG_API_HOST}/bot{TG_BOT_TOKEN}/sendMessage"
else:
url = f"https://api.telegram.org/bot{TG_BOT_TOKEN}/sendMessage"
headers = {'Content-Type': 'application/x-www-form-urlencoded'} url = f'https://push.hellyw.com/{push_config.get("IGOT_PUSH_KEY")}'
payload = {'chat_id': str(TG_USER_ID), 'text': f'{title}\n\n{content}', 'disable_web_page_preview': 'true'} data = {"title": title, "content": content}
proxies = None headers = {"Content-Type": "application/x-www-form-urlencoded"}
if TG_PROXY_IP and TG_PROXY_PORT: response = requests.post(url, data=data, headers=headers).json()
proxyStr = "http://{}:{}".format(TG_PROXY_IP, TG_PROXY_PORT)
proxies = {"http": proxyStr, "https": proxyStr} if response["ret"] == 0:
try: print("iGot 推送成功!")
response = requests.post(url=url, headers=headers, params=payload, proxies=proxies).json()
except:
print('推送失败!')
if response['ok']:
print('推送成功!')
else:
print('推送失败!')
except Exception as e:
print(e)
def dingding_bot(title, content):
timestamp = str(round(time.time() * 1000)) # 时间戳
secret_enc = DD_BOT_SECRET.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, DD_BOT_SECRET)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code)) # 签名
print('开始使用 钉钉机器人 推送消息...', end='')
url = f'https://oapi.dingtalk.com/robot/send?access_token={DD_BOT_ACCESS_TOKEN}&timestamp={timestamp}&sign={sign}'
headers = {'Content-Type': 'application/json;charset=utf-8'}
data = {
'msgtype': 'text',
'text': {'content': f'{title}\n\n{content}'}
}
response = requests.post(url=url, data=json.dumps(data), headers=headers, timeout=15).json()
if not response['errcode']:
print('推送成功!')
else: else:
print('推送失败!') print(f'iGot 推送失败!{response["errMsg"]}')
def coolpush_bot(title, content): def serverJ(title: str, content: str) -> None:
print("\n") """
if not QQ_SKEY or not QQ_MODE: 通过 serverJ 推送消息
print("qq服务的QQ_SKEY或者QQ_MODE未设置!!\n取消推送") """
if not push_config.get("PUSH_KEY"):
print("serverJ 服务的 PUSH_KEY 未设置!!\n取消推送")
return return
print("qq服务启动") print("serverJ 服务启动")
url = f"https://qmsg.zendee.cn/{QQ_MODE}/{QQ_SKEY}"
payload = {'msg': f"{title}\n\n{content}".encode('utf-8')} data = {"text": title, "desp": content.replace("\n", "\n\n")}
response = requests.post(url=url, params=payload).json() if push_config.get("PUSH_KEY").index("SCT") != -1:
if response['code'] == 0: url = f'https://sctapi.ftqq.com/{push_config.get("PUSH_KEY")}.send'
print('推送成功!')
else: else:
print('推送失败!') url = f'https://sc.ftqq.com/${push_config.get("PUSH_KEY")}.send'
response = requests.post(url, data=data).json()
if response.get("errno") == 0 or response.get("code") == 0:
print("serverJ 推送成功!")
else:
print(f'serverJ 推送失败!错误码:{response["message"]}')
# push推送
def pushplus_bot(title, content): def pushplus_bot(title: str, content: str) -> None:
try: """
print("\n") 通过 push+ 推送消息
if not PUSH_PLUS_TOKEN: """
print("PUSHPLUS服务的token未设置!!\n取消推送") if not push_config.get("PUSH_PLUS_TOKEN"):
print("PUSHPLUS 服务的 PUSH_PLUS_TOKEN 未设置!!\n取消推送")
return return
print("PUSHPLUS 服务启动") print("PUSHPLUS 服务启动")
url = 'http://www.pushplus.plus/send'
url = "http://www.pushplus.plus/send"
data = { data = {
"token": PUSH_PLUS_TOKEN, "token": push_config.get("PUSH_PLUS_TOKEN"),
"title": title, "title": title,
"content": content "content": content,
"topic": push_config.get("PUSH_PLUS_USER"),
} }
body = json.dumps(data).encode(encoding='utf-8') body = json.dumps(data).encode(encoding="utf-8")
headers = {'Content-Type': 'application/json'} headers = {"Content-Type": "application/json"}
response = requests.post(url=url, data=body, headers=headers).json() response = requests.post(url=url, data=body, headers=headers).json()
if response['code'] == 200:
print('推送成功!') if response["code"] == 200:
print("PUSHPLUS 推送成功!")
else: else:
print('推送失败!')
except Exception as e:
print(e)
url_old = "http://pushplus.hxtrip.com/send"
headers["Accept"] = "application/json"
response = requests.post(url=url_old, data=body, headers=headers).json()
# 企业微信 APP 推送 if response["code"] == 200:
def wecom_app(title, content): print("PUSHPLUS(hxtrip) 推送成功!")
try:
if not QYWX_AM: else:
print("QYWX_AM 并未设置!!\n取消推送") print("PUSHPLUS 推送失败!")
def qmsg_bot(title: str, content: str) -> None:
"""
使用 qmsg 推送消息
"""
if not push_config.get("QMSG_KEY") or not push_config.get("QMSG_TYPE"):
print("qmsg 的 QMSG_KEY 或者 QMSG_TYPE 未设置!!\n取消推送")
return return
QYWX_AM_AY = re.split(',', QYWX_AM) print("qmsg 服务启动")
url = f'https://qmsg.zendee.cn/{push_config.get("QMSG_TYPE")}/{push_config.get("QMSG_KEY")}'
payload = {"msg": f'{title}\n\n{content.replace("----", "-")}'.encode("utf-8")}
response = requests.post(url=url, params=payload).json()
if response["code"] == 0:
print("qmsg 推送成功!")
else:
print(f'qmsg 推送失败!{response["reason"]}')
def wecom_app(title: str, content: str) -> None:
"""
通过 企业微信 APP 推送消息
"""
if not push_config.get("QYWX_AM"):
print("QYWX_AM 未设置!!\n取消推送")
return
QYWX_AM_AY = re.split(",", push_config.get("QYWX_AM"))
if 4 < len(QYWX_AM_AY) > 5: if 4 < len(QYWX_AM_AY) > 5:
print("QYWX_AM 设置错误!!\n取消推送") print("QYWX_AM 设置错误!!\n取消推送")
return return
print("企业微信 APP 服务启动")
corpid = QYWX_AM_AY[0] corpid = QYWX_AM_AY[0]
corpsecret = QYWX_AM_AY[1] corpsecret = QYWX_AM_AY[1]
touser = QYWX_AM_AY[2] touser = QYWX_AM_AY[2]
agentid = QYWX_AM_AY[3] agentid = QYWX_AM_AY[3]
try: try:
media_id = QYWX_AM_AY[4] media_id = QYWX_AM_AY[4]
except: except IndexError:
media_id = '' media_id = ""
wx = WeCom(corpid, corpsecret, agentid) wx = WeCom(corpid, corpsecret, agentid)
# 如果没有配置 media_id 默认就以 text 方式发送 # 如果没有配置 media_id 默认就以 text 方式发送
if not media_id: if not media_id:
message = title + '\n\n' + content message = title + "\n\n" + content
response = wx.send_text(message, touser) response = wx.send_text(message, touser)
else: else:
response = wx.send_mpnews(title, content, media_id, touser) response = wx.send_mpnews(title, content, media_id, touser)
if response == 'ok':
print('推送成功!') if response == "ok":
print("企业微信推送成功!")
else: else:
print('推送失败!错误信息如下:\n', response) print("企业微信推送失败!错误信息如下:\n", response)
except Exception as e:
print(e)
class WeCom: class WeCom:
@ -289,32 +356,37 @@ class WeCom:
self.AGENTID = agentid self.AGENTID = agentid
def get_access_token(self): def get_access_token(self):
url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken' url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
values = {'corpid': self.CORPID, values = {
'corpsecret': self.CORPSECRET, "corpid": self.CORPID,
"corpsecret": self.CORPSECRET,
} }
req = requests.post(url, params=values) req = requests.post(url, params=values)
data = json.loads(req.text) data = json.loads(req.text)
return data["access_token"] return data["access_token"]
def send_text(self, message, touser="@all"): def send_text(self, message, touser="@all"):
send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + self.get_access_token() send_url = (
"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token="
+ self.get_access_token()
)
send_values = { send_values = {
"touser": touser, "touser": touser,
"msgtype": "text", "msgtype": "text",
"agentid": self.AGENTID, "agentid": self.AGENTID,
"text": { "text": {"content": message},
"content": message "safe": "0",
},
"safe": "0"
} }
send_msges = (bytes(json.dumps(send_values), 'utf-8')) send_msges = bytes(json.dumps(send_values), "utf-8")
respone = requests.post(send_url, send_msges) respone = requests.post(send_url, send_msges)
respone = respone.json() respone = respone.json()
return respone["errmsg"] return respone["errmsg"]
def send_mpnews(self, title, message, media_id, touser="@all"): def send_mpnews(self, title, message, media_id, touser="@all"):
send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + self.get_access_token() send_url = (
"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token="
+ self.get_access_token()
)
send_values = { send_values = {
"touser": touser, "touser": touser,
"msgtype": "mpnews", "msgtype": "mpnews",
@ -326,93 +398,144 @@ class WeCom:
"thumb_media_id": media_id, "thumb_media_id": media_id,
"author": "Author", "author": "Author",
"content_source_url": "", "content_source_url": "",
"content": message.replace('\n', '<br/>'), "content": message.replace("\n", "<br/>"),
"digest": message "digest": message,
} }
] ]
},
} }
} send_msges = bytes(json.dumps(send_values), "utf-8")
send_msges = (bytes(json.dumps(send_values), 'utf-8'))
respone = requests.post(send_url, send_msges) respone = requests.post(send_url, send_msges)
respone = respone.json() respone = respone.json()
return respone["errmsg"] return respone["errmsg"]
def one(): def wecom_bot(title: str, content: str) -> None:
url = 'https://v1.hitokoto.cn/'
res = requests.get(url).json()
# noinspection PyBroadException
try:
result = res['hitokoto'] + ' ---' + res['from']
except:
return '出错了请检查'
return result
def send(title, content):
""" """
使用 bark, telegram bot, dingding bot, serverJ 发送手机推送 通过 企业微信机器人 推送消息
:param title:
:param content:
:return:
""" """
text = one() if not push_config.get("QYWX_KEY"):
content += '\n\n\n'+text print("企业微信机器人 服务的 QYWX_KEY 未设置!!\n取消推送")
for i in notify_mode: return
if i == 'bark': print("企业微信机器人服务启动")
if BARK:
bark(title=title, content=content) url = f"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={push_config.get('QYWX_KEY')}"
else: headers = {"Content-Type": "application/json;charset=utf-8"}
print('未启用 bark') data = {"msgtype": "text", "text": {"content": f"{title}\n\n{content}"}}
continue response = requests.post(
if i == 'sc_key': url=url, data=json.dumps(data), headers=headers, timeout=15
if SCKEY: ).json()
serverJ(title=title, content=content)
else: if response["errcode"] == 0:
print('未启用 Server酱') print("企业微信机器人推送成功!")
continue
elif i == 'go_cqhttp':
if GOBOT_URL and GOBOT_QQ:
go_cqhttp(title=title, content=content)
else:
print('未启用 go-cqhttp')
continue
elif i == 'dingding_bot':
if DD_BOT_ACCESS_TOKEN and DD_BOT_SECRET:
dingding_bot(title=title, content=content)
else:
print('未启用 钉钉机器人')
continue
elif i == 'telegram_bot':
if TG_BOT_TOKEN and TG_USER_ID:
telegram_bot(title=title, content=content)
else:
print('未启用 telegram机器人')
continue
elif i == 'coolpush_bot':
if QQ_SKEY and QQ_MODE:
coolpush_bot(title=title, content=content)
else:
print('未启用 QQ机器人')
continue
elif i == 'pushplus_bot':
if PUSH_PLUS_TOKEN:
pushplus_bot(title=title, content=content)
else: else:
print('未启用 PUSHPLUS机器人') print("企业微信机器人推送失败!")
continue
elif i == 'wecom_app':
if QYWX_AM: def telegram_bot(title: str, content: str) -> None:
wecom_app(title=title, content=content) """
使用 telegram 机器人 推送消息
"""
if not push_config.get("TG_BOT_TOKEN") or not push_config.get("TG_USER_ID"):
print("tg 服务的 bot_token 或者 user_id 未设置!!\n取消推送")
return
print("tg 服务启动")
if push_config.get("TG_API_HOST"):
url = f"https://{push_config.get('TG_API_HOST')}/bot{push_config.get('TG_BOT_TOKEN')}/sendMessage"
else: else:
print('未启用企业微信应用消息推送') url = (
continue f"https://api.telegram.org/bot{push_config.get('TG_BOT_TOKEN')}/sendMessage"
)
headers = {"Content-Type": "application/x-www-form-urlencoded"}
payload = {
"chat_id": str(push_config.get("TG_USER_ID")),
"text": f"{title}\n\n{content}",
"disable_web_page_preview": "true",
}
proxies = None
if push_config.get("TG_PROXY_HOST") and push_config.get("TG_PROXY_PORT"):
if push_config.get("TG_PROXY_AUTH") is not None and "@" not in push_config.get(
"TG_PROXY_HOST"
):
push_config["TG_PROXY_HOST"] = (
push_config.get("TG_PROXY_AUTH")
+ "@"
+ push_config.get("TG_PROXY_HOST")
)
proxyStr = "http://{}:{}".format(
push_config.get("TG_PROXY_HOST"), push_config.get("TG_PROXY_PORT")
)
proxies = {"http": proxyStr, "https": proxyStr}
response = requests.post(
url=url, headers=headers, params=payload, proxies=proxies
).json()
if response["ok"]:
print("tg 推送成功!")
else: else:
print('此类推送方式不存在') print("tg 推送失败!")
def one() -> str:
"""
获取一条一言
:return:
"""
url = "https://v1.hitokoto.cn/"
res = requests.get(url).json()
return res["hitokoto"] + " ----" + res["from"]
if push_config.get("BARK_PUSH"):
notify_function.append(bark)
if push_config.get("CONSOLE"):
notify_function.append(console)
if push_config.get("DD_BOT_TOKEN") and push_config.get("DD_BOT_SECRET"):
notify_function.append(dingding_bot)
if push_config.get("FSKEY"):
notify_function.append(feishu_bot)
if push_config.get("GOBOT_URL") and push_config.get("GOBOT_QQ"):
notify_function.append(go_cqhttp)
if push_config.get("GOTIFY_URL") and push_config.get("GOTIFY_TOKEN"):
notify_function.append(gotify)
if push_config.get("IGOT_PUSH_KEY"):
notify_function.append(iGot)
if push_config.get("PUSH_KEY"):
notify_function.append(serverJ)
if push_config.get("PUSH_PLUS_TOKEN"):
notify_function.append(pushplus_bot)
if push_config.get("QMSG_KEY") and push_config.get("QMSG_TYPE"):
notify_function.append(qmsg_bot)
if push_config.get("QYWX_AM"):
notify_function.append(wecom_app)
if push_config.get("QYWX_KEY"):
notify_function.append(wecom_bot)
if push_config.get("TG_BOT_TOKEN") and push_config.get("TG_USER_ID"):
notify_function.append(telegram_bot)
def send(title: str, content: str) -> None:
if not content:
print(f"{title} 推送内容为空!")
return
hitokoto = push_config.get("HITOKOTO")
text = one() if hitokoto else ""
content += "\n\n" + text
ts = [
threading.Thread(target=mode, args=(title, content), name=mode.__name__)
for mode in notify_function
]
[t.start() for t in ts]
[t.join() for t in ts]
def main(): def main():
send('title', 'content') send("title", "content")
if __name__ == '__main__': if __name__ == "__main__":
main() main()

35
ck_163game.py

@ -1,35 +0,0 @@
import requests
import json
from getENV import getENv
from checksendNotify import send
"""
建议cron: 20 8 * * *
new Env('网易云游戏');
"""
def game163(Authorization):
headers = {
'user-agent': 'Mozilla/5.0 (Linux; Android 10; Redmi K30 Build/QKQ1.190825.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/85.0.4183.127 Mobile Safari/537.36',
## 下面填抓包来的参数########
'Authorization': Authorization
}
url = 'http://n.cg.163.com/api/v2/sign-today'
r = requests.post(url, headers=headers).text
if r[0] == "{":
return "cookie已失效"
else:
return "签到成功"
def start():
getENv()
with open("/ql/config/check.json", "r", encoding="utf-8") as f:
datas = json.loads(f.read())
_check_item = datas.get("163game", [])
res = game163(_check_item.get('Authorization'))
print(res)
send("网易云游戏", res)
if __name__ == "__main__":
start()

150
ck_acfun.py

@ -1,150 +0,0 @@
# -*- coding: utf-8 -*-
"""
建议cron: 31 7 * * *
new Env('AcFun');
"""
import json
import requests
import urllib3
from getENV import getENv
from checksendNotify import send
urllib3.disable_warnings()
class AcFunCheckIn:
def __init__(self, check_item: dict):
self.check_item = check_item
self.contentid = "27259341"
@staticmethod
def get_cookies(session, phone, password):
url = "https://id.app.acfun.cn/rest/app/login/signin"
headers = {
"Host": "id.app.acfun.cn",
"user-agent": "AcFun/6.39.0 (iPhone; iOS 14.3; Scale/2.00)",
"devicetype": "0",
"accept-language": "zh-Hans-CN;q=1, en-CN;q=0.9, ja-CN;q=0.8, zh-Hant-HK;q=0.7, io-Latn-CN;q=0.6",
"accept": "application/json",
"content-type": "application/x-www-form-urlencoded",
}
data = f"password={password}&username={phone}"
response = session.post(url=url, data=data, headers=headers, verify=False)
acpasstoken = response.json().get("acPassToken")
auth_key = str(response.json().get("auth_key"))
if acpasstoken and auth_key:
cookies = {"acPasstoken": acpasstoken, "auth_key": auth_key}
return cookies
else:
return False
@staticmethod
def get_token(session, cookies):
url = "https://id.app.acfun.cn/rest/web/token/get"
headers = {
"Content-Type": "application/x-www-form-urlencoded",
}
response = session.post(url=url, cookies=cookies, data="sid=acfun.midground.api", headers=headers, verify=False)
return response.json().get("acfun.midground.api_st")
def get_video(self, session):
url = "https://api-ipv6.acfunchina.com/rest/app/rank/channel"
data = "channelId=0&rankPeriod=DAY"
headers = {
"Content-Type": "application/x-www-form-urlencoded",
}
response = session.post(url=url, data=data, headers=headers, verify=False)
self.contentid = response.json().get("rankList")[0].get("contentId")
return self.contentid
@staticmethod
def sign(session, cookies):
headers = {"acPlatform": "IPHONE"}
response = session.post(
url="https://api-ipv6.acfunchina.com/rest/app/user/signIn", headers=headers, cookies=cookies, verify=False
)
return response.json().get("msg")
@staticmethod
def danmu(session, cookies):
url = "https://api-ipv6.acfunchina.com/rest/app/new-danmaku/add"
body = "body=sitoi&color=16777215&id=27259341&mode=1&position=5019&size=25&subChannelId=84&subChannelName=%E4" \
"%B8%BB%E6%9C%BA%E5%8D%95%E6%9C%BA&type=douga&videoId=22898696 "
headers = {
"Content-Type": "application/x-www-form-urlencoded",
}
response = session.post(url=url, headers=headers, cookies=cookies, data=body, verify=False)
if response.json().get("result") == 0:
msg = "弹幕成功"
else:
msg = "弹幕失败"
return msg
def throwbanana(self, session, cookies):
url = "https://api-ipv6.acfunchina.com/rest/app/banana/throwBanana"
body = f"count=1&resourceId={self.contentid}&resourceType=2"
headers = {
"Content-Type": "application/x-www-form-urlencoded",
}
response = session.post(url=url, headers=headers, cookies=cookies, data=body, verify=False)
if response.json().get("result") == 0:
msg = "香蕉成功"
else:
msg = "香蕉失败"
return msg
def like(self, session, token):
like_url = "https://api.kuaishouzt.com/rest/zt/interact/add"
unlike_url = "https://api.kuaishouzt.com/rest/zt/interact/delete"
headers = {
"Content-Type": "application/x-www-form-urlencoded",
}
cookies = {"acfun.midground.api_st": token, "kpn": "ACFUN_APP"}
body = f"interactType=1&objectId={self.contentid}&objectType=2&subBiz=mainApp"
response = session.post(url=like_url, headers=headers, cookies=cookies, data=body, verify=False)
session.post(url=unlike_url, headers=headers, cookies=cookies, data=body, verify=False)
if response.json().get("result") == 1:
msg = "点赞成功"
else:
msg = "点赞失败"
return msg
def share(self, session, cookies):
url = "https://api-ipv6.acfunchina.com/rest/app/task/reportTaskAction?taskType=1&market=tencent&product=ACFUN_APP&appMode=0"
headers = {
"Content-Type": "application/x-www-form-urlencoded",
}
response = session.get(url=url, headers=headers, cookies=cookies, verify=False)
if response.json().get("result") == 0:
msg = "分享成功"
else:
msg = "分享失败"
return msg
def main(self):
phone = self.check_item.get("acfun_phone")
password = self.check_item.get("acfun_password")
session = requests.session()
self.get_video(session=session)
cookies = self.get_cookies(session=session, phone=phone, password=password)
token = self.get_token(session=session, cookies=cookies)
sign_msg = self.sign(session=session, cookies=cookies)
like_msg = self.like(session=session, token=token)
share_msg = self.share(session=session, cookies=cookies)
danmu_msg = self.danmu(session=session, cookies=cookies)
throwbanana_msg = self.throwbanana(session=session, cookies=cookies)
msg = (
f"帐号信息: {phone}\n签到状态: {sign_msg}\n点赞任务: {like_msg}\n"
f"弹幕任务: {danmu_msg}\n香蕉任务: {throwbanana_msg}\n分享任务: {share_msg}"
)
return msg
if __name__ == "__main__":
getENv()
with open("/ql/config/check.json", "r", encoding="utf-8") as f:
datas = json.loads(f.read())
_check_item = datas.get("ACFUN_ACCOUNT_LIST", [])[0]
res = AcFunCheckIn(check_item=_check_item).main()
print(res)
send('AcFun', res)

59
ck_baidu_url_submit.py

@ -1,59 +0,0 @@
# -*- coding: utf-8 -*-
"""
建议cron: 32 7 * * *
new Env('百度搜索资源平台');
"""
import json
from urllib import parse
import requests
from getENV import getENv
from checksendNotify import send
class BaiduUrlSubmit:
def __init__(self, check_item: dict):
self.check_item = check_item
@staticmethod
def url_submit(data_url: str, submit_url: str, times: int = 100) -> str:
site = parse.parse_qs(parse.urlsplit(submit_url).query).get("site")[0]
urls_data = requests.get(url=data_url)
remian = 100000
success_count = 0
error_count = 0
for one in range(times):
try:
response = requests.post(url=submit_url, data=urls_data)
if response.json().get("success"):
remian = response.json().get("remain")
success_count += response.json().get("success")
else:
error_count += 1
except Exception as e:
print(e)
error_count += 1
msg = (
f"站点地址: {site}\n当天剩余的可推送 url 条数: {remian}\n成功推送的 url 条数: {success_count}\n"
f"成功推送的 url 次数: {times - error_count}\n失败推送的 url 次数: {error_count}"
)
return msg
def main(self):
data_url = self.check_item.get("data_url")
submit_url = self.check_item.get("submit_url")
times = int(self.check_item.get("times", 100))
if data_url and submit_url:
msg = self.url_submit(data_url=data_url, submit_url=submit_url, times=times)
else:
msg = "配置错误"
return msg
if __name__ == "__main__":
getENv()
with open("/ql/config/check.json", "r", encoding="utf-8") as f:
datas = json.loads(f.read())
_check_item = datas.get("BAIDU_URL_SUBMIT_LIST", [])[0]
res = BaiduUrlSubmit(check_item=_check_item).main()
print(res)
send("百度搜索资源平台", res)

345
ck_bilibili.py

@ -1,345 +0,0 @@
# -*- coding: utf-8 -*-
"""
建议cron: 30 8 * * *
new Env('哔哩哔哩');
"""
import json
import os
import requests
from requests import utils
from getENV import getENv
from checksendNotify import send
class BiliBiliCheckIn(object):
# TODO 待测试,需要大会员账号测试领取福利
def __init__(self, check_item: dict):
self.check_item = check_item
@staticmethod
def get_nav(session):
url = "https://api.bilibili.com/x/web-interface/nav"
ret = session.get(url=url).json()
uname = ret.get("data", {}).get("uname")
uid = ret.get("data", {}).get("mid")
is_login = ret.get("data", {}).get("isLogin")
coin = ret.get("data", {}).get("money")
vip_type = ret.get("data", {}).get("vipType")
current_exp = ret.get("data", {}).get("level_info", {}).get("current_exp")
return uname, uid, is_login, coin, vip_type, current_exp
@staticmethod
def reward(session) -> dict:
"""取B站经验信息"""
url = "https://account.bilibili.com/home/reward"
ret = session.get(url=url).json()
return ret
@staticmethod
def live_sign(session) -> dict:
"""B站直播签到"""
try:
url = "https://api.live.bilibili.com/xlive/web-ucenter/v1/sign/DoSign"
ret = session.get(url=url).json()
if ret["code"] == 0:
msg = f'签到成功,{ret["data"]["text"]},特别信息:{ret["data"]["specialText"]},本月已签到{ret["data"]["hadSignDays"]}'
elif ret["code"] == 1011040:
msg = "今日已签到过,无法重复签到"
else:
msg = f'签到失败,信息为: {ret["message"]}'
except Exception as e:
msg = f"签到异常,原因为{str(e)}"
print(msg)
return msg
@staticmethod
def manga_sign(session, platform="android") -> dict:
"""
模拟B站漫画客户端签到
"""
try:
url = "https://manga.bilibili.com/twirp/activity.v1.Activity/ClockIn"
post_data = {"platform": platform}
ret = session.post(url=url, data=post_data).json()
if ret["code"] == 0:
msg = "签到成功"
elif ret["msg"] == "clockin clockin is duplicate":
msg = "今天已经签到过了"
else:
msg = f'签到失败,信息为({ret["msg"]})'
print(msg)
except Exception as e:
msg = f"签到异常,原因为: {str(e)}"
print(msg)
return msg
@staticmethod
def vip_privilege_receive(session, bili_jct, receive_type: int = 1) -> dict:
"""
领取B站大会员权益
receive_type int 权益类型1为B币劵2为优惠券
"""
url = "https://api.bilibili.com/x/vip/privilege/receive"
post_data = {"type": receive_type, "csrf": bili_jct}
ret = session.post(url=url, data=post_data).json()
return ret
@staticmethod
def vip_manga_reward(session) -> dict:
"""获取漫画大会员福利"""
url = "https://manga.bilibili.com/twirp/user.v1.User/GetVipReward"
ret = session.post(url=url, json={"reason_id": 1}).json()
return ret
@staticmethod
def report_task(session, bili_jct, aid: int, cid: int, progres: int = 300) -> dict:
"""
B站上报视频观看进度
aid int 视频av号
cid int 视频cid号
progres int 观看秒数
"""
url = "http://api.bilibili.com/x/v2/history/report"
post_data = {"aid": aid, "cid": cid, "progres": progres, "csrf": bili_jct}
ret = session.post(url=url, data=post_data).json()
return ret
@staticmethod
def share_task(session, bili_jct, aid) -> dict:
"""
分享指定av号视频
aid int 视频av号
"""
url = "https://api.bilibili.com/x/web-interface/share/add"
post_data = {"aid": aid, "csrf": bili_jct}
ret = session.post(url=url, data=post_data).json()
return ret
@staticmethod
def get_followings(
session, uid: int, pn: int = 1, ps: int = 50, order: str = "desc", order_type: str = "attention"
) -> dict:
"""
获取指定用户关注的up主
uid int 账户uid默认为本账户非登录账户只能获取20个*5
pn int 页码默认第一页
ps int 每页数量默认50
order str 排序方式默认desc
order_type 排序类型默认attention
"""
params = {
"vmid": uid,
"pn": pn,
"ps": ps,
"order": order,
"order_type": order_type,
}
url = f"https://api.bilibili.com/x/relation/followings"
ret = session.get(url=url, params=params).json()
return ret
@staticmethod
def space_arc_search(
session, uid: int, pn: int = 1, ps: int = 100, tid: int = 0, order: str = "pubdate", keyword: str = ""
) -> dict:
"""
获取指定up主空间视频投稿信息
uid int 账户uid默认为本账户
pn int 页码默认第一页
ps int 每页数量默认50
tid int 分区 默认为0(所有分区)
order str 排序方式默认pubdate
keyword str 关键字默认为空
"""
params = {
"mid": uid,
"pn": pn,
"ps": ps,
"tid": tid,
"order": order,
"keyword": keyword,
}
url = f"https://api.bilibili.com/x/space/arc/search"
ret = session.get(url=url, params=params).json()
data_list = [
{"aid": one.get("aid"), "cid": 0, "title": one.get("title"), "owner": one.get("author")}
for one in ret.get("data", {}).get("list", {}).get("vlist", [])
]
return data_list
@staticmethod
def elec_pay(session, bili_jct, uid: int, num: int = 50) -> dict:
"""
用B币给up主充电
uid int up主uid
num int 充电电池数量
"""
url = "https://api.bilibili.com/x/ugcpay/trade/elec/pay/quick"
post_data = {"elec_num": num, "up_mid": uid, "otype": "up", "oid": uid, "csrf": bili_jct}
ret = session.post(url=url, data=post_data).json()
return ret
@staticmethod
def coin_add(session, bili_jct, aid: int, num: int = 1, select_like: int = 1) -> dict:
"""
给指定 av 号视频投币
aid int 视频av号
num int 投币数量
select_like int 是否点赞
"""
url = "https://api.bilibili.com/x/web-interface/coin/add"
post_data = {
"aid": aid,
"multiply": num,
"select_like": select_like,
"cross_domain": "true",
"csrf": bili_jct,
}
ret = session.post(url=url, data=post_data).json()
return ret
@staticmethod
def live_status(session) -> dict:
"""B站直播获取金银瓜子状态"""
url = "https://api.live.bilibili.com/pay/v1/Exchange/getStatus"
ret = session.get(url=url).json()
data = ret.get("data")
silver = data.get("silver", 0)
gold = data.get("gold", 0)
coin = data.get("coin", 0)
msg = f"银瓜子数量: {silver}\n金瓜子数量: {gold}\n硬币数量: {coin}"
return msg
@staticmethod
def silver2coin(session, bili_jct) -> dict:
"""银瓜子兑换硬币"""
url = "https://api.live.bilibili.com/pay/v1/Exchange/silver2coin"
post_data = {"csrf_token": bili_jct}
ret = session.post(url=url, data=post_data).json()
return ret
@staticmethod
def get_region(session, rid=1, num=6) -> dict:
"""
获取 B站分区视频信息
rid int 分区号
num int 获取视频数量
"""
url = "https://api.bilibili.com/x/web-interface/dynamic/region?ps=" + str(num) + "&rid=" + str(rid)
ret = session.get(url=url).json()
data_list = [
{
"aid": one.get("aid"),
"cid": one.get("cid"),
"title": one.get("title"),
"owner": one.get("owner", {}).get("name"),
}
for one in ret.get("data", {}).get("archives", [])
]
return data_list
def main(self):
bilibili_cookie = {
item.split("=")[0]: item.split("=")[1] for item in self.check_item.get("bilibili_cookie").split("; ")
}
bili_jct = bilibili_cookie.get("bili_jct")
coin_num = self.check_item.get("coin_num", 0)
coin_type = self.check_item.get("coin_type", 1)
silver2coin = self.check_item.get("silver2coin", True)
session = requests.session()
requests.utils.add_dict_to_cookiejar(session.cookies, bilibili_cookie)
session.headers.update(
{
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.64",
"Referer": "https://www.bilibili.com/",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"Connection": "keep-alive",
}
)
success_count = 0
uname, uid, is_login, coin, vip_type, current_exp = self.get_nav(session=session)
if is_login:
manhua_msg = self.manga_sign(session=session)
live_msg = self.live_sign(session=session)
aid_list = self.get_region(session=session)
reward_ret = self.reward(session=session)
coins_av_count = reward_ret.get("data", {}).get("coins_av") // 10
coin_num = coin_num - coins_av_count
coin_num = coin_num if coin_num < coin else coin
if coin_type == 1 and coin_num:
following_list = self.get_followings(session=session, uid=uid)
for following in following_list.get("data", {}).get("list"):
mid = following.get("mid")
if mid:
aid_list += self.space_arc_search(session=session, uid=mid)
if coin_num > 0:
for aid in aid_list[::-1]:
ret = self.coin_add(session=session, aid=aid.get("aid"), bili_jct=bili_jct)
if ret["code"] == 0:
coin_num -= 1
print(f'成功给{aid.get("title")}投一个币')
success_count += 1
elif ret["code"] == 34005:
print(f'投币{aid.get("title")}失败,原因为{ret["message"]}')
continue
# -104 硬币不够了 -111 csrf 失败 34005 投币达到上限
else:
print(f'投币{aid.get("title")}失败,原因为{ret["message"]},跳过投币')
break
if coin_num <= 0:
break
coin_msg = f"今日成功投币{success_count + coins_av_count}/{self.check_item.get('coin_num', 5)}"
else:
coin_msg = f"今日成功投币{coins_av_count}/{self.check_item.get('coin_num', 5)}"
aid = aid_list[0].get("aid")
cid = aid_list[0].get("cid")
title = aid_list[0].get("title")
report_ret = self.report_task(session=session, bili_jct=bili_jct, aid=aid, cid=cid)
if report_ret.get("code") == 0:
report_msg = f"观看《{title}》300秒"
else:
report_msg = f"任务失败"
print(report_msg)
share_ret = self.share_task(session=session, bili_jct=bili_jct, aid=aid)
if share_ret.get("code") == 0:
share_msg = f"分享《{title}》成功"
else:
share_msg = f"分享失败"
print(share_msg)
if silver2coin:
silver2coin_ret = self.silver2coin(session=session, bili_jct=bili_jct)
if silver2coin_ret["code"] == 0:
silver2coin_msg = f"成功将银瓜子兑换为1个硬币"
else:
silver2coin_msg = silver2coin_ret["message"]
else:
silver2coin_msg = f"未开启银瓜子兑换硬币功能"
live_stats = self.live_status(session=session)
uname, uid, is_login, new_coin, vip_type, new_current_exp = self.get_nav(session=session)
reward_ret = self.reward(session=session)
login = reward_ret.get("data", {}).get("login")
watch_av = reward_ret.get("data", {}).get("watch_av")
coins_av = reward_ret.get("data", {}).get("coins_av", 0)
share_av = reward_ret.get("data", {}).get("share_av")
today_exp = len([one for one in [login, watch_av, share_av] if one]) * 5
today_exp += coins_av
update_data = (28800 - new_current_exp) // (today_exp if today_exp else 1)
msg = (
f"帐号信息: {uname}\n漫画签到: {manhua_msg}\n直播签到: {live_msg}\n"
f"登陆任务: 今日已登陆\n观看视频: {report_msg}\n分享任务: {share_msg}\n投币任务: {coin_msg}\n"
f"银瓜子兑换硬币: {silver2coin_msg}\n今日获得经验: {today_exp}\n当前经验: {new_current_exp}\n"
f"按当前速度升级还需: {update_data}\n{live_stats}"
)
return msg
if __name__ == "__main__":
getENv()
with open("/ql/config/check.json", "r", encoding="utf-8") as f:
datas = json.loads(f.read())
_check_item = datas.get("BILIBILI_COOKIE_LIST", [])[0]
res = BiliBiliCheckIn(check_item=_check_item).main()
print(res)
send('哔哩哔哩', res)

159
ck_cloud189.py

@ -1,159 +0,0 @@
# -*- coding: utf-8 -*-
"""
建议cron: 30 9 * * *
new Env('天翼网盘');
"""
# 修改来自于 https://github.com/MayoBlueSky/My-Actions/blob/master/function/cloud189/checkin.py
import base64
import json
import os
import re
import time
import requests
import rsa
from getENV import getENv
from checksendNotify import send
class Cloud189CheckIn:
def __init__(self, check_item: dict):
self.check_item = check_item
self.b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
@staticmethod
def int2char(a):
return list("0123456789abcdefghijklmnopqrstuvwxyz")[a]
def b64tohex(self, a):
d = ""
e = 0
c = 0
for i in range(len(a)):
if list(a)[i] != "=":
v = self.b64map.index(list(a)[i])
if 0 == e:
e = 1
d += self.int2char(v >> 2)
c = 3 & v
elif 1 == e:
e = 2
d += self.int2char(c << 2 | v >> 4)
c = 15 & v
elif 2 == e:
e = 3
d += self.int2char(c)
d += self.int2char(v >> 2)
c = 3 & v
else:
e = 0
d += self.int2char(c << 2 | v >> 4)
d += self.int2char(15 & v)
if e == 1:
d += self.int2char(c << 2)
return d
def rsa_encode(self, j_rsakey, string):
rsa_key = f"-----BEGIN PUBLIC KEY-----\n{j_rsakey}\n-----END PUBLIC KEY-----"
pubkey = rsa.PublicKey.load_pkcs1_openssl_pem(rsa_key.encode())
result = self.b64tohex((base64.b64encode(rsa.encrypt(f"{string}".encode(), pubkey))).decode())
return result
def login(self, session, username, password):
url = "https://cloud.189.cn/api/portal/loginUrl.action?redirectURL=https://cloud.189.cn/web/redirect.html"
r = session.get(url=url)
captchatoken = re.findall(r"captchaToken' value='(.+?)'", r.text)[0]
lt = re.findall(r'lt = "(.+?)"', r.text)[0]
returnurl = re.findall(r"returnUrl = '(.+?)'", r.text)[0]
paramid = re.findall(r'paramId = "(.+?)"', r.text)[0]
j_rsakey = re.findall(r'j_rsaKey" value="(\S+)"', r.text, re.M)[0]
session.headers.update({"lt": lt})
username = self.rsa_encode(j_rsakey, username)
password = self.rsa_encode(j_rsakey, password)
url = "https://open.e.189.cn/api/logbox/oauth2/loginSubmit.do"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/76.0",
"Referer": "https://open.e.189.cn/",
}
data = {
"appKey": "cloud",
"accountType": "01",
"userName": f"{{RSA}}{username}",
"password": f"{{RSA}}{password}",
"validateCode": "",
"captchaToken": captchatoken,
"returnUrl": returnurl,
"mailSuffix": "@189.cn",
"paramId": paramid,
}
r = session.post(url, data=data, headers=headers, timeout=5)
if r.json()["result"] == 0:
redirect_url = r.json()["toUrl"]
session.get(url=redirect_url)
return True
else:
return "登陆状态: " + r.json()["msg"]
@staticmethod
def sign(session):
rand = str(round(time.time() * 1000))
surl = f"https://api.cloud.189.cn/mkt/userSign.action?rand={rand}&clientType=TELEANDROID&version=8.6.3&model=SM-G930K"
url = "https://m.cloud.189.cn/v2/drawPrizeMarketDetails.action?taskId=TASK_SIGNIN&activityId=ACT_SIGNIN"
url2 = "https://m.cloud.189.cn/v2/drawPrizeMarketDetails.action?taskId=TASK_SIGNIN_PHOTOS&activityId=ACT_SIGNIN"
headers = {
"User-Agent": "Mozilla/5.0 (Linux; Android 5.1.1; SM-G930K Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.136 Mobile Safari/537.36 Ecloud/8.6.3 Android/22 clientId/355325117317828 clientModel/SM-G930K imsi/460071114317824 clientChannelId/qq proVersion/1.0.6",
"Referer": "https://m.cloud.189.cn/zhuanti/2016/sign/index.jsp?albumBackupOpened=1",
"Host": "m.cloud.189.cn",
"Accept-Encoding": "gzip, deflate",
}
response = session.get(url=surl, headers=headers)
netdiskbonus = response.json().get("netdiskBonus")
if response.json().get("isSign") == "false":
msg = f"签到结果: 未签到,签到获得 {netdiskbonus}M 空间"
else:
msg = f"签到结果: 已经签到过了,签到获得 {netdiskbonus}M 空间"
response = session.get(url=url, headers=headers)
if "errorCode" in response.text:
msg += f"\n第一次抽奖: {response.json().get('errorCode')}"
else:
description = response.json().get("description", "")
if description in ["1", 1]:
description = "50M空间"
msg += f"\n第一次抽奖: 获得{description}"
response = session.get(url=url2, headers=headers)
if "errorCode" in response.text:
msg += f"\n第二次抽奖: {response.json().get('errorCode')}"
else:
description = response.json().get("description", "")
if description in ["1", 1]:
description = "50M空间"
msg += f"\n第二次抽奖: 获得{description}"
return msg
def main(self):
cloud189_phone = self.check_item.get("cloud189_phone")
cloud189_password = self.check_item.get("cloud189_password")
session = requests.Session()
flag = self.login(session=session, username=cloud189_phone, password=cloud189_password)
if flag is True:
sign_msg = self.sign(session=session)
else:
sign_msg = flag
msg = f"帐号信息: {cloud189_phone}\n{sign_msg}"
return msg
def start():
getENv()
with open("/ql/config/check.json", "r", encoding="utf-8") as f:
datas = json.loads(f.read())
_check_item = datas.get("CLOUD189_ACCOUNT_LIST", [])[0]
res = Cloud189CheckIn(check_item=_check_item).main()
print(res)
send('天翼网盘', res)
if __name__ == "__main__":
start()

63
ck_csdn.py

@ -1,63 +0,0 @@
# -*- coding: utf-8 -*-
"""
建议cron: 30 10 * * *
new Env('CSDN');
"""
import json
import requests
from getENV import getENv
from checksendNotify import send
class CSDNCheckIn:
def __init__(self, check_item):
self.check_item = check_item
self.headers = {
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_2) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/88.0.4324.182 Safari/537.36 Edg/88.0.705.74",
}
def sign(self, cookies):
response = requests.get(
url="https://me.csdn.net/api/LuckyDraw_v2/signIn", headers=self.headers, cookies=cookies
).json()
if response.get("code") == 200:
msg = response.get("data").get("msg")
else:
msg = "签到失败"
print(response)
return msg
def draw(self, cookies):
response = requests.get(
url="https://me.csdn.net/api/LuckyDraw_v2/goodluck", headers=self.headers, cookies=cookies
).json()
if response.get("code") == 200:
msg = response.get("data").get("msg")
else:
msg = "抽奖失败"
return msg
def main(self):
csdn_cookie = {
item.split("=")[0]: item.split("=")[1] for item in self.check_item.get("csdn_cookie").split("; ")
}
try:
user_name = csdn_cookie.get("UserName", "")
except Exception as e:
print(f"获取用户信息失败: {e}")
user_name = "未获取到用户信息"
sign_msg = self.sign(cookies=csdn_cookie)
draw_msg = self.draw(cookies=csdn_cookie)
msg = f"帐号信息: {user_name}\n签到信息: {sign_msg}\n抽奖结果: {draw_msg}"
return msg
if __name__ == "__main__":
getENv()
with open("/ql/config/check.json", "r", encoding="utf-8") as f:
datas = json.loads(f.read())
_check_item = datas.get("CSDN_COOKIE_LIST", [])[0]
res = CSDNCheckIn(check_item=_check_item).main()
print(res)
send("CSDN", res)

368
ck_duokan.py

@ -1,368 +0,0 @@
# -*- coding: utf-8 -*-
"""
建议cron: 30 20 * * *
new Env('多看阅读');
"""
import json
import time
import requests
from getENV import getENv
from checksendNotify import send
class DuoKanCheckIn:
def __init__(self, check_item):
self.check_item = check_item
self.gift_code_list = [
"d16ad58199c69518a4afd87b5cf0fe67",
"828672d6bc39ccd25e1f6ad34e00b86c",
"f0ccc1bb1cecea673c197b928fb8dbd9",
"6b86c490d92a138de9a0ae6847781caa",
"c707047e8b820ba441d29cf87dff341e",
"82b2c012a956b18cff2388d24f2574a6",
"87d6b5183a361ee1f6ea8cece1ee83c3",
"9d42576f7e99c94bb752fde06e6770a5",
"e58d1f67a82a539d9331baaa3785a943",
"52c95192ebcb1d0113a748df58a72055",
"511f33e481fe4504d2637aaf6cbbbaff",
"6e986f36f4a45cadf61d2f246b27cdc6",
"f27797a6a1d7fe495b0f4de05f799327",
"4bd335e899fa665f15eea2f215156321",
"9355df762183f084473432b5c6900c44",
"4fb21fb04cbbae9d65556c3958603674",
"2d02ceb4f1bc916510c7407ce4eca5a5",
"ef314bf665af0b51294e624244acd7d6",
"1b441a2ab8e9e7dcf11a55b85931132f",
"005d2345782ab456e5af167336b70623",
"51ac508a4d494654035f17f1d646779b",
"0f6579670f1081f1bcba89dd64645b48",
"0cd858abe26f0d3db561185fe26bbb75",
"b5f5fd5b47fd587cb003807e97bed783",
"6ac9509a5cb799efeb1bb877c505f7e3",
"b5dd986ffc84762429901ffe633d82a0",
"f98a436cc2c85943d23d986a8d84c3bd",
"6fc387f2a17b8564ca212e2b16544cc3",
"12ead6a62411402378c6311199a0b2ef",
"7d8dcf31e2e69fcf6bd8af4f48831e92",
"446c3d0303b0dbd6bc2157844f1222ad",
"439890227d823ff57bed8ad351fa1b75",
"645acf3107722ab26b9d3194ecd156ff",
"afcb41dd9bc54d752c26ace985b49960",
"1100ab94ccd2e8373af70326c194d8ea",
"373d73c0c0975cf959eb4c40dc82b27c",
"2167ac28833149e9ad4ca217bcfa1a62",
"80547afccc42f34e4c8c4083e00a41a6",
"b604dda473644bd8157bafdf4ae518dc",
"15eaa8f727b595d512b82f55364b53b9",
"8fb656937fd613ccbbcacdc384595b03",
"dd8410da0b5144ba4aba5a618723b72e",
"204208386b056a2288e541110bfeeec3",
"c5b2e7344efd4128bcab5840fa427103",
"0168601e4335095c502e2e550ca53114",
"dfa12fe056a8deee35da18613173560f",
"ed945efdef9c7b2de41249a4fed3945e",
"b9ece5964ab62d51f8b70ffd35191e9d",
"f0e0ca4ca0b8afd766821a4922a2873c",
"5c687b8c6bd641f3f2c0d6aaeceafff6",
"c983be6420027231d77b748f9d02c1f2",
"7c53358df8156d979cb6cbb74e15877b",
"a58058035f73628a7c0847c66c350e88",
"79dd039ca5cf401993801710f9900d6b",
"5aff116c2cec01fcc69b389034f456a2",
"d006927cd9bfd620a6af4f76ee3c4100",
"410fe62830eeb91ca48be24ffe596364",
"9d18226ff144a72812d0104ce59fb34e",
"de439c7f75ca80b1d5b8aba619ee200d",
"00d1a0479590793294bfdd5c427643aa",
"d57176b1ce88135243bd501e448b8559",
"7c500eff681637b97dd526bb11737abb",
"3e197e47aaac926ccd50c37eb2828311",
"7db084ea5987f841ad77240bcbb8ce54",
"cce74f0facc50d47c0dd0e3e2f7435fb",
"f8bb53fbeb9b2d45db8aca1401817599",
"5baf7f0f355db11eeb0e936b675cdb82",
"4478a3354de6bcd7e91b49e28a2b2b3f",
"66a0338d93af82e956122288b08d2b4b",
"9f598b2b1c9cd0f2b20e335831cce366",
"9f4a45fec88b2820653abba179759eb6",
"41086649c9a39ec977ba42f9ce81f828",
"06ccca6fd73a6e38f65638ab8abbab76",
"0cfa0a034a203bb3a22be499e74906f4",
"c0d1da35a8878b7e4dcdf44bf3cd6b96",
"f34921e16f6518c1149cc083bd8e1ad7",
"ed0be3c70075d1d8f1a412f9e59a12e7",
"eb4d6324bae7db952bd220cb4d57a3de",
"5ba65d9f8ad735681b594f5092f6ab37",
"2fa6e0b612962937edb37ed7043923fd",
"baa8268c7d85d793011c5f5b977f8d4b",
"f4842a465e4583646abf7df67d8e2915",
"12c6332c8c9ded3d58d45f2dae7de8da",
"f56609232205692acf6b6a5d337b0965",
"3e4eed15387843c668fba53641599d07",
"d1b9d9ede145b5d426130986245cb66e",
"2979e43f6ab786f5d68cc262105f3c45",
"118a18ed578c78f4855b416f8271b29a",
"9122e158d034f094627c70ed6c3d0c33",
"dd5413c17253e86cc4247984f3bb77e5",
"b36bb0124b962efccbb601486665ce9e",
"6afb3a719f8b0a0b2f744b3dad8b15ab",
"faf18d64268402ed2975a3f60bc9e651",
"9f4081944d4ca3fa7b831d7c3b6c289d",
"367d7a3d77a9f96cbd7903b33c30b61f",
"605276cf621ff9ba34a99e3675a006f6",
"a50a734c1a3a749918e20205505ef91d",
"271ff14ba5edfe89a80a3430227bc11b",
"3bae338062b4bb3a5087eb13cbcc6efe",
"9b443d60178a9bcb08bae62c41970abf",
"a4f6e97741054f3567ab6a7257c63ab1",
"e06a82cc1f05eda4947e5fa0927d89c5",
"4fa3b4fc274c283efb02c0a1ddd133e7",
"4aa59e16a3961ed1ebd12b7f15d79547",
"f75fe88eaa24fc28ac57d963d8b90f2d",
"42cbe52b6f74761a5a7a79bf370c30ef",
"7d4571b5c9710e3b5481330bc7123ecc",
"fcf2f7ec42086809991de5aed5e7ef0d",
"bb7de9aaf68a83ac1ddbe75ba913b8af",
"a9bd964b97e785fffb641edb9b402d3f",
"6a815be6f537b2351e947ed66f74e209",
"27ae4e4d71395c6255bf7ea57c496507",
"2b07f369e90f4fc34ef419d891a2906f",
"7a2dc8a5b3fc0c7ecddb97ed1ce2c833",
"e7ad152ef27beb80c5d343f41f885b21",
"ba21758aed15a3a20a27f63bc0d84626",
"3820f7b8e1ece2614a11264501b5c93e",
"c3c41c87e6bf752f5237b4fffa33f08b",
"ed21086ff6682ab8495ecbfbb697af4a",
"5a2585ff3524f319dfd1f6b735c9a18d",
"0e61444507f0a780a1c83b612eb5fb9b",
"b105aa5c696648c0f7aae9e3933f8fe0",
"fec8f729e9e1d02248b949ce17674e0c",
"d3323d5560d15d4bc03575dcd0f53ae9",
"15fbf9d24dd05d9d64a18a8fd28f4dcc",
"ac0f3bda53081eee547882b2cdc8b04f",
"5dd3fadcd4ea6b922e1462431966c2bf",
"4acb71816dad0ce9a53d8fee301d857c",
"4c7e173f3a046919587db5b2640896e7",
"8407dc0459d0b367eaced7e5dfdef8ed",
"17e02409659223ff4e32cabd9ad352d9",
"c49edc07086b27769eddb981359f56b2",
"344822f5d8d53fe9aa7a1c7328cd2c59",
"92259343c65ac0feab5cb56b2e851783",
"e1e537b0bd37091c0ba4d5f614af9160",
"dff1116c175ddaaa20f3985a3d88abc6",
"3b1131a7c7273aa61cbd71b044e9beca",
"431aab37ef168c383f078b9244008cee",
"96c3bb8355d7e3ed7265095374f1c090",
"c3a7d304cdb307f073bef5003d1b8b78",
"627d884fc905cc353d0028076e39846b",
"36ce0d88a6bb2d10e0dc0a697f64df4e",
"dc8dbd035d42a5d8170976d5f532dab0",
"01c2665e7ea15bc56cca6d955c2e8ae1",
"c54ae7eeedc87ac52249684f012d3805",
"2df9b3b8f21a682b20d9d77669087a7a",
"fded473150a783586c12692fd57d0825",
"580499e69f42c0ccba0d1f87a83e41e9",
"99433cb83f1cd7176b7cdeaa7be49cd8",
"fbd76e8265547376905b3b6004150064",
"362768496052ae0dfbe909a9b5c6f54e",
"4f33581089c90944e5ad950646b17712",
"bffe93cdfe4b8833190e0a59c779e027",
"78e042b792c3af7faf7a6ebfedf6af9e",
"51a59c881726c2887efe9752bd9db715",
"a46ecf03d3f4038ba3de4ae4ac28170f",
"48d025f7cc34ac29c21d03b2c1f36449",
"8c9ceb77d61c20cb96ee652eb7b838c9",
"47a5882c89671429ae532339b7f333ce",
"a0b735557416ff3d08d3d8440393061a",
"976d3b3a8fbdf33d525075a9288455ab",
"636ca4c1db1c4450431ecd7e10a5e671",
"8c5cd12180027ee6535a837bd4f0259a",
"b82315333974c76793b3c7f517fe977c",
"6143d1f3472cd7cf08e3780918019158",
"20d032426fd66d49bec4f99579252cfa",
"398ee715d1dfd058a912bc7768d35f82",
"1f678678966444fb53d118b8134ceb94",
"d6641f3ed9444eae2b77ba68d3552f6a",
"ab2babaa19539895a5285c1ded6de8c6",
"5bc61d3cd53582b859db9cf04fc7e250",
"5deb619ed27c2754df4f9c7e3ce16b82",
"b81a322830fee59c75985626f7e0a8b5",
"e2313ad53d58e181c5fbaef29e5772c3",
"70d2aa99ef48b6cf1c0e8c107c0e121d",
"0633cdb06253a2b11e9a9ca234a3e9c3",
"bd1cbb9764fba94e8f1c0d1c024487af",
"301cbdbf26210596f9b22123abff0ca8",
"1fc2448ee192a1d0806ae1eb6fcc81fe",
"306247030d0b6442c3ded42e9ca99872",
"1c8f9a0786a01db1d06989345887967e",
"256ec3a54aaae719aae88d8f9c7f9b5f",
"45645896cccec48191916fec482979d9",
"c3a19c728d6fd39925bd63abe15aa446",
"15f45c4cd8fd4a6c0a3fae14ccafff47",
"a082c46b09772739af41f01676e1d0d1",
"14928418f94f5d35b182001ae0160455",
"dfbc5bc946c72650adaaf570f11a1e80",
"8a312e3e30d2e8fd1cf8873c3abe1d8c",
"ef425403acaabfb2a5b3f6ab0aafce8c",
"c78d471822dd961a53afe23e6c2dfa61",
"a40f670d8de3784b54784daf63095d88",
"49a72ace7fd54d8d0833bb2590db58aa",
"38e3808d28de73af3578f6d64020e1fc",
"a8be6ab39263d2edf61acafc60949921",
"d9c16bf0032800916e948ea26624a253",
"dbf3a62ff403c3ba94d5ab1e6219f5bc",
"3a6415de684e2978ce17543d66d523f6",
"2f69a681ee1ff927df1bdbd5431ced1d",
"e55c0390872735ec285dad8ebdd939e0",
]
self.code_list = [
"K7S36GFSZC",
"A2AMBFHP6C",
"K5HHKUU14D",
"J18UK6YYAY",
"1BJGW140U5",
]
self.headers = {"Content-Type": "application/x-www-form-urlencoded; charset=utf-8"}
@staticmethod
def get_data(cookies):
device_id = cookies.get("device_id")
t = int(time.time())
t_device_id = f"{device_id}&{t}"
c = 0
for index, one in enumerate(t_device_id):
c = (c * 131 + ord(one)) % 65536
data = f"_t={t}&_c={c}"
return data
def sign(self, cookies):
url = "https://www.duokan.com/checkin/v0/checkin"
data = self.get_data(cookies=cookies)
response = requests.post(url=url, data=data, cookies=cookies, headers=self.headers)
result = response.json()
msg = result.get("msg")
return msg
def info(self, cookies):
url = "https://www.duokan.com/store/v0/award/coin/list"
data = f"sandbox=0&{self.get_data(cookies=cookies)}&withid=1"
response = requests.post(url=url, data=data, cookies=cookies, headers=self.headers)
result = response.json()
if "尚未登录" not in result.get("msg"):
coin = sum([one.get('coin') for one in result.get("data", {}).get("award")])
msg = f"当前书豆: {coin}\n" + "\n".join(
[f"{one.get('expire')} 到期,{one.get('coin')} 书豆" for one in result.get("data", {}).get("award")])
return msg
else:
return "账号异常: Cookie 失效"
def free(self, cookies):
url = "https://www.duokan.com/hs/v4/channel/query/2027"
response = requests.get(url=url, cookies=cookies, headers=self.headers)
bid = response.json().get("items")[0].get("data").get("book_id")
data = f"payment_name=BC&ch=VSZUVB&book_id={bid}&price=0&allow_discount=1"
free_url = "https://www.duokan.com/store/v0/payment/book/create"
response = requests.post(url=free_url, data=data, cookies=cookies, headers=self.headers)
result = response.json()
if "尚未登录" not in result.get("msg"):
book_title = result.get("book").get("title")
book_msg = result.get("msg")
msg = f"今日限免: {book_title} · {book_msg}"
return msg
else:
return "今日限免: Cookie 失效"
def gift(self, cookies):
url = "https://www.duokan.com/events/common_task_gift_check"
data = f"code=KYKJF7LL0G&{self.get_data(cookies=cookies)}&withid=1"
response = requests.post(url=url, data=data, cookies=cookies, headers=self.headers)
result = response.json()
if result.get("chances") == 0:
msg = "体验任务: 已经做完啦"
elif result.get("chances"):
num = 0
for gift_code in self.gift_code_list:
url = "https://www.duokan.com/events/common_task_gift"
data = f"code=KYKJF7LL0G&chances=1&sign={gift_code}&{self.get_data(cookies=cookies)}&withid=1"
response = requests.post(url=url, data=data, cookies=cookies, headers=self.headers)
result = response.json()
if result.get("msg") == "成功":
num += 30
print("体验任务完成啦!豆子 +30")
else:
print(result.get("data"))
msg = f"体验任务: 获得 {num} 豆子"
else:
msg = f"体验任务: {response.text}"
return msg
def add_draw(self, cookies):
success_count = 0
for one in range(6):
url = "https://www.duokan.com/store/v0/event/chances/add"
data = f"code=8ulcky4bknbe_f&count=1&{self.get_data(cookies=cookies)}&withid=1"
response = requests.post(url=url, data=data, cookies=cookies, headers=self.headers)
result = response.json()
if result.get("result") == 0:
success_count += 1
msg = f"添加抽奖: {success_count}"
return msg
def draw(self, cookies):
success_count = 0
for one in range(6):
url = "https://www.duokan.com/store/v0/event/drawing"
data = f"code=8ulcky4bknbe_f&{self.get_data(cookies=cookies)}&withid=1"
response = requests.post(url=url, data=data, cookies=cookies, headers=self.headers)
result = response.json()
if result.get("result") == 0:
success_count += 1
msg = f"成功抽奖: {success_count}"
return msg
def download(self, cookies):
url = "https://www.duokan.com/events/common_task_gift"
data = f"code=J18UK6YYAY&chances=17&{self.get_data(cookies=cookies)}&withid=1"
response = requests.post(url=url, data=data, cookies=cookies, headers=self.headers)
result = response.json()
msg = "下载任务: " + result.get("msg")
return msg
def task(self, cookies):
success_count = 0
url = "https://www.duokan.com/events/tasks_gift"
for code in self.code_list:
data = f"code={code}&chances=3&{self.get_data(cookies=cookies)}&withid=1"
response = requests.post(url=url, data=data, cookies=cookies, headers=self.headers)
result = response.json()
if result.get("result") == 0:
success_count += 1
return f"其他任务: 完成 {success_count}"
def main(self):
duokan_cookie = {
item.split("=")[0]: item.split("=")[1] for item in self.check_item.get("duokan_cookie").split("; ")
}
sign_msg = self.sign(cookies=duokan_cookie)
free_msg = self.free(cookies=duokan_cookie)
gift_msg = self.gift(cookies=duokan_cookie)
add_draw_msg = self.add_draw(cookies=duokan_cookie)
draw_msg = self.draw(cookies=duokan_cookie)
download_msg = self.download(cookies=duokan_cookie)
task_msg = self.task(cookies=duokan_cookie)
info_msg = self.info(cookies=duokan_cookie)
msg = (
f"每日签到: {sign_msg}\n{free_msg}\n{gift_msg}\n"
f"{add_draw_msg}\n{draw_msg}\n{download_msg}\n{task_msg}\n{info_msg}"
)
return msg
if __name__ == "__main__":
getENv()
with open("/ql/config/check.json", "r", encoding="utf-8") as f:
datas = json.loads(f.read())
_check_item = datas.get("DUOKAN_COOKIE_LIST", [])[2]
res = DuoKanCheckIn(check_item=_check_item).main()
print(res)
send("多看阅读",res)

104
ck_fmapp.py

@ -1,104 +0,0 @@
# -*- coding: utf-8 -*-
"""
建议cron: 30 14 * * *
new Env('米家');
"""
import json
import requests
from getENV import getENv
from checksendNotify import send
class FMAPPCheckIn:
def __init__(self, check_item):
self.check_item = check_item
@staticmethod
def sign(headers):
try:
url = "https://fmapp.chinafamilymart.com.cn/api/app/market/member/signin/sign"
response = requests.post(url=url, headers=headers).json()
code = response.get("code")
if code == "200":
data = response.get("data", {})
msg = (
f"在坚持{data.get('nextDay')}天即可获得{data.get('nextNumber')}个发米粒\n"
f"签到{data.get('lastDay')}天可获得{data.get('lastNumber')}个发米粒"
)
else:
msg = response.get("message")
except Exception as e:
print("错误信息", str(e))
msg = "未知错误,检查日志"
return msg
@staticmethod
def user_info(headers):
try:
url = "https://fmapp.chinafamilymart.com.cn/api/app/member/info"
response = requests.post(url=url, headers=headers).json()
code = response.get("code")
if code == "200":
data = response.get("data", {})
msg = data.get("nickName")
else:
msg = response.get("message")
except Exception as e:
print("错误信息", str(e))
msg = "未知错误,检查日志"
return msg
@staticmethod
def mili_count(headers):
try:
url = "https://fmapp.chinafamilymart.com.cn/api/app/member/v1/mili/service/detail"
response = requests.post(url=url, headers=headers, data=json.dumps({"pageSize": 10, "pageNo": 1})).json()
code = response.get("code")
if code == "200":
data = response.get("data", {})
msg = data.get("miliNum")
else:
msg = response.get("message")
except Exception as e:
print("错误信息", str(e))
msg = "未知错误,检查日志"
return msg
def main(self):
fmapp_token = self.check_item.get("fmapp_token")
fmapp_cookie = self.check_item.get("fmapp_cookie")
fmapp_blackbox = self.check_item.get("fmapp_blackbox")
fmapp_device_id = self.check_item.get("fmapp_device_id")
fmapp_fmversion = self.check_item.get("fmapp_fmversion", "2.2.3")
fmapp_os = self.check_item.get("fmapp_os", "ios")
fmapp_useragent = self.check_item.get("fmapp_useragent", "Fa")
headers = {
"Accept": "*/*",
"Accept-Language": "zh-Hans;q=1.0",
"Accept-Encoding": "br;q=1.0, gzip;q=0.9, deflate;q=0.8",
"Host": "fmapp.chinafamilymart.com.cn",
"Content-Type": "application/json",
"loginChannel": "app",
"token": fmapp_token,
"fmVersion": fmapp_fmversion,
"deviceId": fmapp_device_id,
"User-Agent": fmapp_useragent,
"os": fmapp_os,
"cookie": fmapp_cookie,
"blackBox": fmapp_blackbox,
}
sign_msg = self.sign(headers=headers)
name_msg = self.user_info(headers=headers)
mili_msg = self.mili_count(headers=headers)
msg = f"帐号信息: {name_msg}\n签到状态: {sign_msg}\n米粒数量: {mili_msg}"
return msg
if __name__ == "__main__":
getENv()
with open("/ql/config/check.json", "r", encoding="utf-8") as f:
datas = json.loads(f.read())
_check_item = datas.get("FMAPP_ACCOUNT_LIST", [])[0]
res = FMAPPCheckIn(check_item=_check_item).main()
print(res)
send("米家APP", res)

115
ck_hlx.py

@ -1,115 +0,0 @@
"""
建议cron: 30 7 * * * python3 ck_hlx.py
new Env('葫芦侠签到');
"""
import requests
import os
from getENV import getENv
from checksendNotify import send
import json
r = requests.Session()
def login(user, passwd):
url = 'http://floor.huluxia.com/account/login/ANDROID/4.0?platform=2&gkey=000000&app_version=4.0.0.6.2' \
'&versioncode=20141433&market_id=floor_baidu&_key=&device_code=%5Bw%5D02%3A00%3A00%3A00%3A00%3A00 '
params = {
'account': user,
'login_type': '2',
'password': passwd
}
login_res = r.post(url=url, data=params)
login_res = login_res.json()
nick = login_res['user']['nick']
key = login_res['_key']
s_key = login_res['session_key']
return nick, key, s_key
def check(key):
url1 = 'http://floor.huluxia.com/user/status/ANDROID/2.1'
params = {
'platform': '2',
'gkey': '000000',
'app_version': '4.0.0.6.3',
'versioncode': '20141434',
'market_id': 'floor_baidu',
'_key': key,
'device_code': '%5Bw%5D02%3A00%3A00%3A00%3A00%3A00',
}
check_req = r.get(url=url1, params=params)
check_req = check_req.json()
status = check_req['status']
if status == 0:
raise Exception("令牌验证失败")
elif status == 1:
pass
return status
def category(key):
global experienceVal
titles = []
categoryIDs = []
category_url = 'http://floor.huluxia.com/category/list/ANDROID/2.0'
params = {
'platform': '2',
'gkey': '000000',
'app_version': '4.0.0.6.3',
'versioncode': '20141434',
'market_id': 'floor_huluxia',
'_key': key,
'device_code': '%5Bw%5D02%3A00%3A00%3A00%3A00%3A00',
'is_hidden': '1'
}
category_res = r.get(url=category_url, params=params)
category_res = category_res.json()
category_res = category_res["categories"]
for i in range(3, len(category_res)):
res = category_res[i]
titles.append(res['title'])
categoryIDs.append(res['categoryID'])
# print(res)
url = f'http://floor.huluxia.com/user/signin/ANDROID/4.0'
all_experienceVal = 0
for i in range(0, len(categoryIDs)):
IDS = str(categoryIDs[i])
params = {
'platform': '2',
'gkey': '000000',
'app_version': '4.0.0.6.3',
'versioncode': '20141434',
'market_id': 'floor_baidu',
'_key': key,
'device_code': '%5Bw%5D02%3A00%3A00%3A00%3A00%3A00',
'cat_id': IDS
}
try:
experienceVal = r.get(url=url, params=params).json()['experienceVal']
except:
experienceVal = 0
finally:
all_experienceVal = all_experienceVal + experienceVal
return '签到成功 共获得{}点经验'.format(all_experienceVal)
def hlx(user, passwd):
nick, key, s_key = login(user, passwd)
check(key)
return "用户名:" + nick + category(key)
def start():
getENv()
with open("/ql/config/check.json", "r", encoding="utf-8") as f:
datas = json.loads(f.read())
_check_item = datas.get("HLX", [])
res = hlx(user=_check_item.get('user'),passwd=_check_item.get('password'))
print(res)
send('葫芦侠', res)
if __name__ == '__main__':
start()

219
ck_iqiyi.py

@ -1,219 +0,0 @@
# -*- coding: utf-8 -*-
"""
建议cron: 55 23 * * *
new Env('爱奇艺');
"""
import json
import os
import re
import time
from urllib.parse import unquote
import requests
from getENV import getENv
from checksendNotify import send
class IQIYICheckIn:
def __init__(self, check_item):
self.check_item = check_item
@staticmethod
def parse_cookie(cookie):
p00001 = re.findall(r"P00001=(.*?);", cookie)[0]
p00002 = re.findall(r"P00002=(.*?);", cookie)[0] if re.findall(r"P00002=(.*?);", cookie) else ""
p00003 = re.findall(r"P00003=(.*?);", cookie)[0]
return p00001, p00002, p00003
@staticmethod
def user_information(p00001):
"""
用户信息查询
"""
time.sleep(3)
url = "http://serv.vip.iqiyi.com/vipgrowth/query.action"
params = {"P00001": p00001}
res = requests.get(url=url, params=params).json()
if res["code"] == "A00000":
try:
res_data = res.get("data", {})
level = res_data.get("level", 0) # VIP 等级
growthvalue = res_data.get("growthvalue", 0) # 当前 VIP 成长值
distance = res_data.get("distance", 0) # 升级需要成长值
deadline = res_data.get("deadline", "非 VIP 用户") # VIP 到期时间
today_growth_value = res_data.get("todayGrowthValue", 0) # 今日成长值
msg = (
f"VIP 等级: {level}\n当前成长值: {growthvalue}\n"
f"升级需成长值: {distance}\n今日成长值: +{today_growth_value}\nVIP 到期时间: {deadline}"
)
except Exception as e:
msg = str(e)
print(msg)
else:
msg = res.get("msg")
return msg
@staticmethod
def sign(p00001):
"""
VIP 签到
"""
url = "https://tc.vip.iqiyi.com/taskCenter/task/queryUserTask"
params = {"P00001": p00001, "autoSign": "yes"}
res = requests.get(url=url, params=params).json()
if res["code"] == "A00000":
try:
growth = res["data"]["signInfo"]["data"]["rewardMap"]["growth"]
continue_sign_days_sum = res["data"]["signInfo"]["data"]["continueSignDaysSum"]
reward_day = (
7 if continue_sign_days_sum % 28 <= 7 else (14 if continue_sign_days_sum % 28 <= 14 else 28)
)
rouund_day = 28 if continue_sign_days_sum % 28 == 0 else continue_sign_days_sum % 28
msg = f"+{growth}成长值\n连续签到: {continue_sign_days_sum}\n签到周期: {rouund_day}天/{reward_day}"
except Exception as e:
print(e)
msg = res["data"]["signInfo"].get("msg")
else:
msg = res.get("msg")
return msg
@staticmethod
def query_user_task(p00001):
"""
获取 VIP 日常任务 taskCode(任务状态)
"""
url = "https://tc.vip.iqiyi.com/taskCenter/task/queryUserTask"
params = {"P00001": p00001}
task_list = []
res = requests.get(url=url, params=params).json()
if res["code"] == "A00000":
for item in res["data"]["tasks"]["daily"]:
task_list.append(
{
"name": item["name"],
"taskCode": item["taskCode"],
"status": item["status"],
"taskReward": item["taskReward"]["task_reward_growth"],
}
)
return task_list
@staticmethod
def join_task(p00001, task_list):
"""
遍历完成任务
"""
url = "https://tc.vip.iqiyi.com/taskCenter/task/joinTask"
params = {"P00001": p00001, "taskCode": "", "platform": "bb136ff4276771f3", "lang": "zh_CN"}
for item in task_list:
if item["status"] == 2:
params["taskCode"] = item["taskCode"]
requests.get(url=url, params=params)
@staticmethod
def get_task_rewards(p00001, task_list):
"""
获取任务奖励
:return: 返回信息
"""
url = "https://tc.vip.iqiyi.com/taskCenter/task/getTaskRewards"
params = {"P00001": p00001, "taskCode": "", "platform": "bb136ff4276771f3", "lang": "zh_CN"}
growth_task = 0
for item in task_list:
if item["status"] == 0:
params["taskCode"] = item.get("taskCode")
requests.get(url=url, params=params)
elif item["status"] == 4:
requests.get(url="https://tc.vip.iqiyi.com/taskCenter/task/notify", params=params)
params["taskCode"] = item.get("taskCode")
requests.get(url=url, params=params)
elif item["status"] == 1:
growth_task += item["taskReward"]
msg = f"+{growth_task}成长值"
return msg
@staticmethod
def draw(draw_type, p00001, p00003):
"""
查询抽奖次数(),抽奖
:param draw_type: 类型0 查询次数1 抽奖
:param p00001: 关键参数
:param p00003: 关键参数
:return: {status, msg, chance}
"""
url = "https://iface2.iqiyi.com/aggregate/3.0/lottery_activity"
params = {
"lottery_chance": 1,
"app_k": "b398b8ccbaeacca840073a7ee9b7e7e6",
"app_v": "11.6.5",
"platform_id": 10,
"dev_os": "8.0.0",
"dev_ua": "FRD-AL10",
"net_sts": 1,
"qyid": "2655b332a116d2247fac3dd66a5285011102",
"psp_uid": p00003,
"psp_cki": p00001,
"psp_status": 3,
"secure_v": 1,
"secure_p": "GPhone",
"req_sn": round(time.time() * 1000),
}
if draw_type == 1:
del params["lottery_chance"]
res = requests.get(url=url, params=params).json()
if not res.get("code"):
chance = int(res.get("daysurpluschance"))
msg = res.get("awardName")
return {"status": True, "msg": msg, "chance": chance}
else:
try:
msg = res.get("kv", {}).get("msg")
except Exception as e:
print(e)
msg = res["errorReason"]
return {"status": False, "msg": msg, "chance": 0}
def main(self):
p00001, p00002, p00003 = self.parse_cookie(self.check_item.get("iqiyi_cookie"))
sign_msg = self.sign(p00001=p00001)
chance = self.draw(0, p00001=p00001, p00003=p00003)["chance"]
if chance:
draw_msg = ""
for i in range(chance):
ret = self.draw(1, p00001=p00001, p00003=p00003)
draw_msg += ret["msg"] + ";" if ret["status"] else ""
else:
draw_msg = "抽奖机会不足"
task_msg = ""
for one in range(6):
task_list = self.query_user_task(p00001=p00001)
self.join_task(p00001=p00001, task_list=task_list)
time.sleep(10)
task_msg = self.get_task_rewards(p00001=p00001, task_list=task_list)
try:
user_info = json.loads(unquote(p00002, encoding="utf-8"))
user_name = user_info.get("user_name")
user_name = user_name.replace(user_name[3:7], "****")
nickname = user_info.get("nickname")
except Exception as e:
print(f"获取用户信息失败,错误信息: {e}")
nickname = "未获取到,请检查 Cookie 中 P00002 字段"
user_name = "未获取到,请检查 Cookie 中 P00002 字段"
user_msg = self.user_information(p00001=p00001)
msg = f"用户账号: {user_name}\n用户昵称: {nickname}\n{user_msg}\n" \
f"签到奖励: {sign_msg}\n任务奖励: {task_msg}\n抽奖奖励: {draw_msg}"
return msg
def start():
getENv()
with open("/ql/config/check.json", "r", encoding="utf-8") as f:
datas = json.loads(f.read())
_check_item = datas.get("IQIYI_COOKIE_LIST", [])[0]
res = IQIYICheckIn(check_item=_check_item).main()
print(res)
send('爱奇艺', res)
if __name__ == "__main__":
start()

139
ck_kgqq.py

@ -1,139 +0,0 @@
# -*- coding: utf-8 -*-
"""
建议cron: 55 14 * * *
new Env('全民k歌');
"""
import json
import requests
from getENV import getENv
from checksendNotify import send
class KGQQCheckIn:
def __init__(self, check_item):
self.check_item = check_item
@staticmethod
def sign(kgqq_cookie):
headers = {"Cookie": kgqq_cookie}
uid = kgqq_cookie.split("; ")
t_uuid = ""
for i in uid:
if i.find("uid=") >= 0:
t_uuid = i.split("=")[1]
proto_profile_url = "https://node.kg.qq.com/webapp/proxy?ns=proto_profile&cmd=profile.getProfile&mapExt=JTdCJTIyZmlsZSUyMiUzQSUyMnByb2ZpbGVfd2ViYXBwSmNlJTIyJTJDJTIyY21kTmFtZSUyMiUzQSUyMlByb2ZpbGVHZXQlMjIlMkMlMjJhcHBpZCUyMiUzQTEwMDA2MjYlMkMlMjJkY2FwaSUyMiUzQSU3QiUyMmludGVyZmFjZUlkJTIyJTNBMjA1MzU5NTk3JTdEJTJDJTIybDVhcGklMjIlM0ElN0IlMjJtb2RpZCUyMiUzQTI5NDAxNyUyQyUyMmNtZCUyMiUzQTI2MjE0NCU3RCUyQyUyMmlwJTIyJTNBJTIyMTAwLjExMy4xNjIuMTc4JTIyJTJDJTIycG9ydCUyMiUzQSUyMjEyNDA2JTIyJTdE&t_uUid={0}".format(
t_uuid
)
url_list = (
[
"https://node.kg.qq.com/webapp/proxy?ns=KG_TASK&cmd=task.getLottery&ns_inbuf=&mapExt=JTdCJTIyZmlsZSUyMiUzQSUyMnRhc2tKY2UlMjIlMkMlMjJjbWROYW1lJTIyJTNBJTIyTG90dGVyeVJlcSUyMiUyQyUyMnduc0NvbmZpZyUyMiUzQSU3QiUyMmFwcGlkJTIyJTNBMTAwMDU1NyU3RCUyQyUyMmw1YXBpJTIyJTNBJTdCJTIybW9kaWQlMjIlM0E1MDM5MzclMkMlMjJjbWQlMjIlM0E1ODk4MjQlN0QlN0Q%3D&t_uid={0}&t_iShowEntry=1&t_type={1}".format(
t_uuid, one
)
for one in ["1", "2"]
]
+ [
"https://node.kg.qq.com/webapp/proxy?ns=KG_TASK&cmd=task.signinGetAward&mapExt=JTdCJTIyZmlsZSUyMiUzQSUyMnRhc2tKY2UlMjIlMkMlMjJjbWROYW1lJTIyJTNBJTIyR2V0U2lnbkluQXdhcmRSZXElMjIlMkMlMjJ3bnNDb25maWclMjIlM0ElN0IlMjJhcHBpZCUyMiUzQTEwMDA2MjYlN0QlMkMlMjJsNWFwaSUyMiUzQSU3QiUyMm1vZGlkJTIyJTNBNTAzOTM3JTJDJTIyY21kJTIyJTNBNTg5ODI0JTdEJTdE&t_uid={0}&t_iShowEntry={1}".format(
t_uuid, one
)
for one in ["1", "2", "4", "16", "128", "512"]
]
+ [
"https://node.kg.qq.com/webapp/proxy?ns=KG_TASK&cmd=task.getLottery&mapExt=JTdCJTIyZmlsZSUyMiUzQSUyMnRhc2tKY2UlMjIlMkMlMjJjbWROYW1lJTIyJTNBJTIyTG90dGVyeVJlcSUyMiUyQyUyMnduc0NvbmZpZyUyMiUzQSU3QiUyMmFwcGlkJTIyJTNBMTAwMDU1NyU3RCUyQyUyMmw1YXBpJTIyJTNBJTdCJTIybW9kaWQlMjIlM0E1MDM5MzclMkMlMjJjbWQlMjIlM0E1ODk4MjQlN0QlN0Q&t_uid={0}&t_iShowEntry=4&t_type=104".format(
t_uuid
),
"https://node.kg.qq.com/webapp/proxy?ns=KG_TASK&cmd=task.getLottery&mapExt=JTdCJTIyZmlsZSUyMiUzQSUyMnRhc2tKY2UlMjIlMkMlMjJjbWROYW1lJTIyJTNBJTIyTG90dGVyeVJlcSUyMiUyQyUyMmw1YXBpJTIyJTNBJTdCJTIybW9kaWQlMjIlM0E1MDM5MzclMkMlMjJjbWQlMjIlM0E1ODk4MjQlN0QlMkMlMjJsNWFwaV9leHAxJTIyJTNBJTdCJTIybW9kaWQlMjIlM0E4MTcwODklMkMlMjJjbWQlMjIlM0EzODAxMDg4JTdEJTdE&t_uid={0}&t_type=103".format(
t_uuid
),
]
)
proto_music_station_url = "https://node.kg.qq.com/webapp/proxy?ns=proto_music_station&cmd=message.batch_get_music_cards&mapExt=JTdCJTIyY21kTmFtZSUyMiUzQSUyMkdldEJhdGNoTXVzaWNDYXJkc1JlcSUyMiUyQyUyMmZpbGUlMjIlM0ElMjJwcm90b19tdXNpY19zdGF0aW9uSmNlJTIyJTJDJTIyd25zRGlzcGF0Y2hlciUyMiUzQXRydWUlN0Q&t_uUid={0}&g_tk_openkey=".format(
t_uuid
)
url_10 = "https://node.kg.qq.com/webapp/proxy?t_stReward%3Aobject=%7B%22uInteractiveType%22%3A1%2C%22uRewardType%22%3A0%2C%22uFlowerNum%22%3A15%7D&ns=proto_music_station&cmd=message.get_reward&mapExt=JTdCJTIyY21kTmFtZSUyMiUzQSUyMkdldFJld2FyZFJlcSUyMiUyQyUyMmZpbGUlMjIlM0ElMjJwcm90b19tdXNpY19zdGF0aW9uSmNlJTIyJTJDJTIyd25zRGlzcGF0Y2hlciUyMiUzQXRydWUlN0Q&t_uUid={0}&t_strUgcId=".format(
t_uuid
)
url_15 = "https://node.kg.qq.com/webapp/proxy?t_stReward%3Aobject=%7B%22uInteractiveType%22%3A0%2C%22uRewardType%22%3A0%2C%22uFlowerNum%22%3A10%7D&ns=proto_music_station&cmd=message.get_reward&mapExt=JTdCJTIyY21kTmFtZSUyMiUzQSUyMkdldFJld2FyZFJlcSUyMiUyQyUyMmZpbGUlMjIlM0ElMjJwcm90b19tdXNpY19zdGF0aW9uSmNlJTIyJTJDJTIyd25zRGlzcGF0Y2hlciUyMiUzQXRydWUlN0Q&t_uUid={0}&t_strUgcId=".format(
t_uuid
)
try:
old_proto_profile_response = requests.get(url=proto_profile_url, headers=headers)
old_num = old_proto_profile_response.json()["data"]["profile.getProfile"]["uFlowerNum"]
nickname = old_proto_profile_response.json()["data"]["profile.getProfile"]["stPersonInfo"]["sKgNick"]
for url in url_list:
try:
requests.get(url=url, headers=headers)
except Exception as e:
print(e)
for g_tk_openkey in range(16):
try:
proto_music_station_resp = requests.get(
url=proto_music_station_url + str(g_tk_openkey), headers=headers
)
if proto_music_station_resp.json().get("code") in [1000]:
return proto_music_station_resp.json().get("msg")
vct_music_cards = proto_music_station_resp.json()["data"]["message.batch_get_music_cards"][
"vctMusicCards"
]
vct_music_cards_list = sorted(
vct_music_cards, key=lambda x: x["stReward"]["uFlowerNum"], reverse=True
)[0]
str_ugc_id = vct_music_cards_list["strUgcId"]
str_key = vct_music_cards_list["strKey"]
url = str_ugc_id + "&t_strKey=" + str_key
u_flower_num = vct_music_cards_list["stReward"]["uFlowerNum"]
if u_flower_num > 10:
requests.get(url=url_10 + url, headers=headers)
elif 1 < u_flower_num < 10:
requests.get(url=url_15 + url, headers=headers)
except Exception as e:
print(e)
# VIP 签到
try:
getinfourl = (
"https://node.kg.qq.com/webapp/proxy?ns=proto_vip_webapp&cmd=vip.get_vip_info&t_uUid="
+ t_uuid
+ "&t_uWebReq=1&t_uGetDataFromC4B=1"
)
inforequest = requests.get(url=getinfourl, headers=headers)
vip_status = inforequest.json()["data"]["vip.get_vip_info"]["stVipCoreInfo"]["uStatus"]
if vip_status == 1:
vipurl = (
"https://node.kg.qq.com/webapp/proxy?t_uUid="
+ t_uuid
+ "&ns=proto_vip_webapp&cmd=vip.get_vip_day_reward&ns_inbuf=&nocache=1613719349184&mapExt=JTdCJTIyY21kTmFtZSUyMiUzQSUyMkdldFZpcERheVJld2FyZCUyMiU3RA%3D%3D&g_tk_openkey=642424811"
)
viprequest = requests.get(url=vipurl, headers=headers)
str_tips = viprequest.json()["data"]["vip.get_vip_day_reward"]["strTips"]
u_cur_reward_num = viprequest.json()["data"]["vip.get_vip_day_reward"]["uCurRewardNum"]
vip_message = f"{str_tips} 获取VIP福利道具:{u_cur_reward_num}"
else:
vip_message = "非 VIP 用户"
except Exception as e:
print(e)
vip_message = "VIP 签到失败"
new_proto_profile_response = requests.get(url=proto_profile_url, headers=headers)
new_num = new_proto_profile_response.json()["data"]["profile.getProfile"]["uFlowerNum"]
get_num = int(new_num) - int(old_num)
kg_message = f"帐号信息: {nickname}\n获取鲜花: {get_num}\n当前鲜花: {new_num}\nVIP签到: {vip_message}"
except Exception as e:
kg_message = str(e)
return kg_message
def main(self):
kgqq_cookie = self.check_item.get("kgqq_cookie")
msg = self.sign(kgqq_cookie=kgqq_cookie)
return msg
if __name__ == "__main__":
getENv()
with open("/ql/config/check.json", "r", encoding="utf-8") as f:
datas = json.loads(f.read())
_check_item = datas.get("KGQQ_COOKIE_LIST", [])[0]
res = KGQQCheckIn(check_item=_check_item).main()
print(res)
send("全民K歌", res)

102
ck_meizu.py

@ -1,102 +0,0 @@
# -*- coding: utf-8 -*-
"""
建议cron: 55 15 * * *
new Env('魅族社区');
"""
import json
import time
import requests
from getENV import getENv
from checksendNotify import send
class MeizuCheckIn:
def __init__(self, check_item):
self.check_item = check_item
@staticmethod
def sign(cookie):
headers = {
"authority": "bbs-act.meizu.cn",
"pragma": "no-cache",
"cache-control": "no-cache",
"accept": "application/json, text/javascript, */*; q=0.01",
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36 Edg/88.0.705.74",
"origin": "https://bbs.meizu.cn",
"referer": "https://bbs.meizu.cn/",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
"cookie": cookie,
}
params = (
("mod", "signin"),
("action", "sign"),
)
response = requests.get(url="https://bbs-act.meizu.cn/index.php", headers=headers, params=params).json()
msg = response.get("message")
return msg
@staticmethod
def draw(cookie, count: int = 0):
headers = {
"authority": "bbs-act.meizu.cn",
"accept": "application/json, text/javascript, */*; q=0.01",
"x-requested-with": "XMLHttpRequest",
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36 Edg/88.0.705.74",
"content-type": "application/x-www-form-urlencoded",
"origin": "https://bbs-act.meizu.cn",
"referer": "https://bbs-act.meizu.cn/2/index.html",
"accept-language": "zh-CN,zh;q=0.9",
"cookie": cookie,
}
data = {"mod": "index", "action": "draw", "id": "2"}
award_list = []
success_count = 0
error_count = 0
if count:
for i in range(count):
try:
data = requests.post(url="https://bbs-act.meizu.cn/index.php", headers=headers, data=data).json()
if data["code"] == 200:
one_msg = data.get("data", {}).get("award_name")
award_list.append(one_msg)
success_count += 1
else:
error_count += 1
print(data.get("code"), data.get("message"))
one_msg = "抽奖失败"
except Exception as e:
one_msg = f"抽奖失败: {e}"
error_count += 1
print(f"{i + 1}次抽奖结果:" + str(one_msg))
time.sleep(5)
msg = f"成功抽奖 {success_count}"
draw_msg = "抽奖状态: " + str(msg)
draw_msg += f"\n抽奖结果: {';'.join(award_list)}"
else:
draw_msg = "抽奖结果: 未开启抽奖"
data = {"mod": "index", "action": "get_user_count", "id": "2"}
user_info = requests.post("https://bbs-act.meizu.cn/index.php", headers=headers, data=data).json()
uid = user_info.get("data", {}).get("uid")
return draw_msg, uid
def main(self):
meizu_cookie = self.check_item.get("meizu_cookie")
try:
draw_count = int(self.check_item.get("draw_count", 0))
except Exception as e:
print("初始化抽奖次数失败: 重置为 0 ", str(e))
draw_count = 0
sign_msg = self.sign(cookie=meizu_cookie)
draw_msg, uid = self.draw(cookie=meizu_cookie, count=draw_count)
msg = f"帐号信息: {uid}\n签到信息: {sign_msg}\n{draw_msg}"
return msg
if __name__ == "__main__":
getENv()
with open("/ql/config/check.json", "r", encoding="utf-8") as f:
datas = json.loads(f.read())
_check_item = datas.get("MEIZU_COOKIE_LIST", [])[0]
res = MeizuCheckIn(check_item=_check_item).main()
print(res)
send("MEIZU 社区",res)

68
ck_mgtv.py

@ -1,68 +0,0 @@
# -*- coding: utf-8 -*-
"""
建议cron: 23 14 * * *
new Env('芒果TV');
"""
import json
import os
import time
from urllib import parse
from getENV import getENv
from checksendNotify import send
import requests
class MgtvCheckIn:
def __init__(self, check_item):
self.check_item = check_item
@staticmethod
def sign(params):
url = "https://credits.bz.mgtv.com/user/creditsTake"
user_params = {
"abroad": params.get("abroad"),
"ageMode": "0",
"appVersion": params.get("appVersion"),
"artistId": params.get("uuid"),
"device": params.get("device"),
"did": params.get("did"),
"mac": params.get("did"),
"osType": params.get("osType"),
"src": "mgtv",
"testversion": "",
"ticket": params.get("ticket"),
"uuid": params.get("uuid"),
}
try:
user_info = requests.get(url="https://homepage.bz.mgtv.com/v2/user/userInfo", params=user_params).json()
username = user_info.get("data", {}).get("nickName")
except Exception as e:
print("获取用户信息失败", e)
username = params.get("uuid")
res = requests.get(url=url, params=params)
res_json = json.loads(res.text.replace(f"{params.get('callback')}(", "").replace(");", ""))
if res_json["code"] == 200:
cur_day = res_json["data"]["curDay"]
_credits = res_json["data"]["credits"]
msg = f"帐号信息: {username}\n签到积分: +{_credits}积分\n已经签到: {cur_day}天/21天"
else:
msg = f"帐号信息: {username}\n签到状态: 已完成签到 or 签到失败"
return msg
def main(self):
mgtv_params = self.check_item.get("mgtv_params")
params = parse.parse_qs(mgtv_params)
params["timestamp"] = [round(time.time())]
params = {key: value[0] for key, value in params.items()}
msg = self.sign(params=params)
return msg
if __name__ == "__main__":
getENv()
with open("/ql/config/check.json", "r", encoding="utf-8") as f:
datas = json.loads(f.read())
_check_item = datas.get("MGTV_PARAMS_LIST", [])[0]
res = MgtvCheckIn(check_item=_check_item).main()
print(res)
send("芒果 TV",res)

114
ck_mimotion.py

File diff suppressed because one or more lines are too long

76
ck_smzdm.py

@ -1,76 +0,0 @@
# -*- coding: utf-8 -*-
import json
import os
import requests
from requests import utils
from getENV import getENv
from checksendNotify import send
"""
建议cron: 51 9 * * *
new Env('什么值得买');
"""
class SmzdmCheckIn:
def __init__(self, check_item):
self.check_item = check_item
@staticmethod
def sign(session):
try:
current = session.get(url="https://zhiyou.smzdm.com/user/info/jsonp_get_current").json()
if current["checkin"]["has_checkin"]:
msg = (
f"用户信息: {current.get('nickname', '')}\n目前积分: {current.get('point', '')}\n"
f"经验值: {current.get('exp', '')}\n金币: {current.get('gold', '')}\n"
f"碎银子: {current.get('silver', '')}\n威望: {current.get('prestige', '')}\n"
f"等级: {current.get('level', '')}\n"
f"已经签到: {current.get('checkin', {}).get('daily_checkin_num', '')}"
)
else:
response = session.get(url="https://zhiyou.smzdm.com/user/checkin/jsonp_checkin").json().get("data", {})
msg = (
f"用户信息: {current.get('nickname', '')}\n目前积分: {response.get('point', '')}\n"
f"增加积分: {response.get('add_point', '')}\n经验值: {response.get('exp', '')}\n"
f"金币: {response.get('gold', '')}\n威望: {response.get('prestige', '')}\n"
f"等级: {response.get('rank', '')}\n"
f"已经签到: {response.get('checkin_num', {})}"
)
except Exception as e:
msg = f"签到状态: 签到失败\n错误信息: {e}"
return msg
def main(self):
smzdm_cookie = {
item.split("=")[0]: item.split("=")[1] for item in self.check_item.get("smzdm_cookie").split("; ")
}
session = requests.session()
requests.utils.add_dict_to_cookiejar(session.cookies, smzdm_cookie)
session.headers.update(
{
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
"Host": "zhiyou.smzdm.com",
"Referer": "https://www.smzdm.com/",
"Sec-Fetch-Dest": "script",
"Sec-Fetch-Mode": "no-cors",
"Sec-Fetch-Site": "same-site",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36",
}
)
sign_msg = self.sign(session=session)
msg = f"{sign_msg}"
return msg
if __name__ == "__main__":
getENv()
with open("/ql/config/check.json", "r", encoding="utf-8") as f:
datas = json.loads(f.read())
_check_item = datas.get("SMZDM_COOKIE_LIST", [])[0]
res = SmzdmCheckIn(check_item=_check_item).main()
print(res)
send('什么值得买',res)

328
ck_vqq.js

File diff suppressed because one or more lines are too long

51
ck_wzyd.py

@ -1,51 +0,0 @@
# -*- coding: utf-8 -*-
"""
建议cron: 00 8 * * *
new Env('王者营地');
"""
import json
import os
from urllib import parse
import requests
from getENV import getENv
from checksendNotify import send
class WZYDCheckIn:
def __init__(self, check_item):
self.check_item = check_item
@staticmethod
def sign(data):
response = requests.post(url="https://ssl.kohsocialapp.qq.com:10001/play/h5sign", data=data).json()
try:
if response["result"] == 0:
msg = "签到成功"
else:
msg = response["returnMsg"]
except:
msg = "请求失败,请检查接口"
return msg
def main(self):
wzyd_data = self.check_item.get("wzyd_data")
data = {k: v[0] for k, v in parse.parse_qs(wzyd_data).items()}
try:
user_id = data.get("userId", "")
except Exception as e:
print(f"获取用户信息失败: {e}")
user_id = "未获取到用户信息"
sign_msg = self.sign(data=data)
msg = f"帐号信息: {user_id}\n签到信息: {sign_msg}"
return msg
if __name__ == "__main__":
getENv()
with open("/ql/config/check.json", "r", encoding="utf-8") as f:
datas = json.loads(f.read())
_check_item = datas.get("WZYD_DATA_LIST", [])[0]
res = WZYDCheckIn(check_item=_check_item).main()
print(res)
send('王者营地', res)

265
config.json

@ -1,265 +0,0 @@
{
"CITY_NAME_LIST": [
"上海"
],
"MOTTO": true,
"IQIYI_COOKIE_LIST": [
{
"iqiyi_cookie": "__dfp=xxxxxx; QP0013=xxxxxx; QP0022=xxxxxx; QYABEX=xxxxxx; P00001=xxxxxx; P00002=xxxxxx; P00003=xxxxxx; P00007=xxxxxx; QC163=xxxxxx; QC175=xxxxxx; QC179=xxxxxx; QC170=xxxxxx; P00010=xxxxxx; P00PRU=xxxxxx; P01010=xxxxxx; QC173=xxxxxx; QC180=xxxxxx; P00004=xxxxxx; QP0030=xxxxxx; QC006=xxxxxx; QC007=xxxxxx; QC008=xxxxxx; QC010=xxxxxx; nu=xxxxxx; __uuid=xxxxxx; QC005=xxxxxx;"
},
{
"iqiyi_cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"VQQ_COOKIE_LIST": [
{
"auth_refresh": "https://access.video.qq.com/user/auth_refresh?vappid=xxxxxx&vsecret=xxxxxx&type=qq&g_tk=&g_vstk=xxxxxx&g_actk=xxxxxx&callback=xxxxxx&_=xxxxxx",
"vqq_cookie": "pgv_pvid=xxxxxx; pac_uid=xxxxxx; RK=xxxxxx; ptcz=xxxxxx; tvfe_boss_uuid=xxxxxx; video_guid=xxxxxx; video_platform=xxxxxx; pgv_info=xxxxxx; main_login=xxxxxx; vqq_access_token=xxxxxx; vqq_appid=xxxxxx; vqq_openid=xxxxxx; vqq_vuserid=xxxxxx; vqq_refresh_token=xxxxxx; login_time_init=xxxxxx; uid=xxxxxx; vqq_vusession=xxxxxx; vqq_next_refresh_time=xxxxxx; vqq_login_time_init=xxxxxx; login_time_last=xxxxxx;"
},
{
"auth_refresh": "多账号 refresh url,请参考上面,以实际获取为准",
"vqq_cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"YOUDAO_COOKIE_LIST": [
{
"youdao_cookie": "JSESSIONID=xxxxxx; __yadk_uid=xxxxxx; OUTFOX_SEARCH_USER_ID_NCOO=xxxxxx; YNOTE_SESS=xxxxxx; YNOTE_PERS=xxxxxx; YNOTE_LOGIN=xxxxxx; YNOTE_CSTK=xxxxxx; _ga=xxxxxx; _gid=xxxxxx; _gat=xxxxxx; PUBLIC_SHARE_18a9dde3de846b6a69e24431764270c4=xxxxxx;"
},
{
"youdao_cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"KGQQ_COOKIE_LIST": [
{
"kgqq_cookie": "muid=xxxxxx; uid=xxxxxx; userlevel=xxxxxx; openid=xxxxxx; openkey=xxxxxx; opentype=xxxxxx; qrsig=xxxxxx; pgv_pvid=xxxxxx;"
},
{
"kgqq_cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"MUSIC163_ACCOUNT_LIST": [
{
"music163_phone": "18888xxxxxx",
"music163_password": "Sitoi"
},
{
"music163_phone": "多账号 手机号",
"music163_password": "多账号 密码"
}
],
"ONEPLUSBBS_COOKIE_LIST": [
{
"oneplusbbs_cookie": "acw_tc=xxxxxx; qKc3_0e8d_saltkey=xxxxxx; qKc3_0e8d_lastvisit=xxxxxx; bbs_avatar=xxxxxx; qKc3_0e8d_sendmail=xxxxxx; opcid=xxxxxx; opcct=xxxxxx; oppt=xxxxxx; opsid=xxxxxx; opsct=xxxxxx; opbct=xxxxxx; UM_distinctid=xxxxxx; CNZZDATA1277373783=xxxxxx; www_clear=xxxxxx; ONEPLUSID=xxxxxx; qKc3_0e8d_sid=xxxxxx; bbs_uid=xxxxxx; bbs_uname=xxxxxx; bbs_grouptitle=xxxxxx; opuserid=xxxxxx; bbs_sign=xxxxxx; bbs_formhash=xxxxxx; qKc3_0e8d_ulastactivity=xxxxxx; opsertime=xxxxxx; qKc3_0e8d_lastact=xxxxxx; qKc3_0e8d_checkpm=xxxxxx; qKc3_0e8d_noticeTitle=xxxxxx; optime_browser=xxxxxx; opnt=xxxxxx; opstep=xxxxxx; opstep_event=xxxxxx; fp=xxxxxx;"
},
{
"oneplusbbs_cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"BAIDU_URL_SUBMIT_LIST": [
{
"data_url": "https://cdn.jsdelivr.net/gh/Sitoi/Sitoi.github.io/baidu_urls.txt",
"submit_url": "http://data.zz.baidu.com/urls?site=https://sitoi.cn&token=xxxxxx",
"times": 10
},
{
"data_url": "多账号 data_url 链接地址,以实际获取为准",
"submit_url": "多账号 submit_url 链接地址,以实际获取为准",
"times": 10
}
],
"FMAPP_ACCOUNT_LIST": [
{
"fmapp_token": "xxxxxx.xxxxxx-xxxxxx-xxxxxx.xxxxxx-xxxxxx",
"fmapp_cookie": "sensorsdata2015jssdkcross=xxxxxx",
"fmapp_blackbox": "eyJlcnJxxxxxx",
"fmapp_device_id": "xxxxxx-xxxx-xxxx-xxxx-xxxxxx",
"fmapp_fmversion": "xxxxxx",
"fmapp_os": "xxxxxx",
"fmapp_useragent": "xxxxxx"
},
{
"fmapp_token": "多账号 token 填写,请参考上面,以实际获取为准",
"fmapp_cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)",
"fmapp_blackbox": "多账号 blackbox 填写,请参考上面,blackbox 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)",
"fmapp_device_id": "多账号 device_id 填写,请参考上面,以实际获取为准",
"fmapp_fmversion": "多账号 fmVersion 填写,请参考上面,以实际获取为准",
"fmapp_os": "多账号 os 填写,请参考上面,以实际获取为准",
"fmapp_useragent": "多账号 User-Agent 填写,请参考上面,以实际获取为准"
}
],
"TIEBA_COOKIE_LIST": [
{
"tieba_cookie": "BIDUPSID=xxxxxx; PSTM=xxxxxx; BAIDUID=xxxxxx; BAIDUID_BFESS=xxxxxx; delPer=xxxxxx; PSINO=xxxxxx; H_PS_PSSID=xxxxxx; BA_HECTOR=xxxxxx; BDORZ=xxxxxx; TIEBA_USERTYPE=xxxxxx; st_key_id=xxxxxx; BDUSS=xxxxxx; BDUSS_BFESS=xxxxxx; STOKEN=xxxxxx; TIEBAUID=xxxxxx; ab_sr=xxxxxx; st_data=xxxxxx; st_sign=xxxxxx;"
},
{
"tieba_cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"BILIBILI_COOKIE_LIST": [
{
"bilibili_cookie": "_uuid=xxxxxx; rpdid=xxxxxx; LIVE_BUVID=xxxxxx; PVID=xxxxxx; blackside_state=xxxxxx; CURRENT_FNVAL=xxxxxx; buvid3=xxxxxx; fingerprint3=xxxxxx; fingerprint=xxxxxx; buivd_fp=xxxxxx; buvid_fp_plain=xxxxxx; DedeUserID=xxxxxx; DedeUserID__ckMd5=xxxxxx; SESSDATA=xxxxxx; bili_jct=xxxxxx; bsource=xxxxxx; finger=xxxxxx; fingerprint_s=xxxxxx;",
"coin_num": 0,
"coin_type": 1,
"silver2coin": true
},
{
"bilibili_cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)",
"coin_num": 0,
"coin_type": 1,
"silver2coin": true
}
],
"V2EX_COOKIE_LIST": [
{
"v2ex_cookie": "_ga=xxxxxx; __cfduid=xxxxxx; PB3_SESSION=xxxxxx; A2=xxxxxx; V2EXSETTINGS=xxxxxx; V2EX_REFERRER=xxxxxx; V2EX_LANG=xxxxxx; _gid=xxxxxx; V2EX_TAB=xxxxxx;",
"v2ex_proxy": "使用代理的信息,无密码例子: http://127.0.0.1:1080 有密码例子: http://username:password@127.0.0.1:1080"
},
{
"v2ex_cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)",
"v2ex_proxy": "使用代理的信息,无密码例子: http://127.0.0.1:1080 有密码例子: http://username:password@127.0.0.1:1080"
}
],
"WWW2NZZ_COOKIE_LIST": [
{
"www2nzz_cookie": "YPx9_2132_saltkey=xxxxxx; YPx9_2132_lastvisit=xxxxxx; YPx9_2132_sendmail=xxxxxx; YPx9_2132_con_request_uri=xxxxxx; YPx9_2132_sid=xxxxxx; YPx9_2132_client_created=xxxxxx; YPx9_2132_client_token=xxxxxx; YPx9_2132_ulastactivity=xxxxxx; YPx9_2132_auth=xxxxxx; YPx9_2132_connect_login=xxxxxx; YPx9_2132_connect_is_bind=xxxxxx; YPx9_2132_connect_uin=xxxxxx; YPx9_2132_stats_qc_login=xxxxxx; YPx9_2132_checkpm=xxxxxx; YPx9_2132_noticeTitle=xxxxxx; YPx9_2132_nofavfid=xxxxxx; YPx9_2132_lastact=xxxxxx;"
},
{
"www2nzz_cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"SMZDM_COOKIE_LIST": [
{
"smzdm_cookie": "__jsluid_s=xxxxxx; __ckguid=xxxxxx; device_id=xxxxxx; homepage_sug=xxxxxx; r_sort_type=xxxxxx; _zdmA.vid=xxxxxx; sajssdk_2015_cross_new_user=xxxxxx; sensorsdata2015jssdkcross=xxxxxx; footer_floating_layer=xxxxxx; ad_date=xxxxxx; ad_json_feed=xxxxxx; zdm_qd=xxxxxx; sess=xxxxxx; user=xxxxxx; _zdmA.uid=xxxxxx; smzdm_id=xxxxxx; userId=xxxxxx; bannerCounter=xxxxxx; _zdmA.time=xxxxxx;"
},
{
"smzdm_cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"MIMOTION_ACCOUNT_LIST": [
{
"mimotion_phone": "18888xxxxxx",
"mimotion_password": "Sitoi",
"mimotion_min_step": "10000",
"mimotion_max_step": "20000"
},
{
"mimotion_phone": "多账号 手机号填写,请参考上面",
"mimotion_password": "多账号 密码填写,请参考上面",
"mimotion_min_step": "多账号 最小步数填写,请参考上面",
"mimotion_max_step": "多账号 最大步数填写,请参考上面"
}
],
"ACFUN_ACCOUNT_LIST": [
{
"acfun_phone": "18888xxxxxx",
"acfun_password": "Sitoi"
},
{
"acfun_phone": "多账号 手机号填写,请参考上面",
"acfun_password": "多账号 密码填写,请参考上面"
}
],
"CLOUD189_ACCOUNT_LIST": [
{
"cloud189_phone": "18888xxxxxx",
"cloud189_password": "Sitoi"
},
{
"cloud189_phone": "多账号 手机号填写,请参考上面",
"cloud189_password": "多账号 密码填写,请参考上面"
}
],
"POJIE_COOKIE_LIST": [
{
"pojie_cookie": "htVD_2132_client_token=xxxxxx; htVD_2132_connect_is_bind=xxxxxx; htVD_2132_connect_uin=xxxxxx; htVD_2132_nofavfid=xxxxxx; htVD_2132_smile=xxxxxx; Hm_lvt_46d556462595ed05e05f009cdafff31a=xxxxxx; htVD_2132_saltkey=xxxxxx; htVD_2132_lastvisit=xxxxxx; htVD_2132_client_created=xxxxxx; htVD_2132_auth=xxxxxx; htVD_2132_connect_login=xxxxxx; htVD_2132_home_diymode=xxxxxx; htVD_2132_visitedfid=xxxxxx; htVD_2132_viewid=xxxxxx; KF4=xxxxxx; htVD_2132_st_p=xxxxxx; htVD_2132_lastcheckfeed=xxxxxx; htVD_2132_sid=xxxxxx; htVD_2132_ulastactivity=xxxxxx; htVD_2132_noticeTitle=xxxxxx;"
},
{
"pojie_cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"MGTV_PARAMS_LIST": [
{
"mgtv_params": "uuid=xxxxxx&uid=xxxxxx&ticket=xxxxxx&token=xxxxxx&device=iPhone&did=xxxxxx&deviceId=xxxxxx&appVersion=6.8.2&osType=ios&platform=iphone&abroad=0&aid=xxxxxx&nonce=xxxxxx&timestamp=xxxxxx&appid=xxxxxx&type=1&sign=xxxxxx&callback=xxxxxx"
},
{
"mgtv_params": "多账号 请求参数填写,请参考上面"
}
],
"PICACOMIC_ACCOUNT_LIST": [
{
"picacomic_email": "Sitoi",
"picacomic_password": "xxxxxx"
},
{
"picacomic_email": "多账号 账号填写,请参考上面",
"picacomic_password": "多账号 密码填写,请参考上面"
}
],
"MEIZU_COOKIE_LIST": [
{
"meizu_cookie": "aliyungf_tc=xxxxxx; logined_uid=xxxxxx; acw_tc=xxxxxx; LT=xxxxxx; MZBBS_2132_saltkey=xxxxxx; MZBBS_2132_lastvisit=xxxxxx; MZBBSUC_2132_auth=xxxxxx; MZBBSUC_2132_loginmember=xxxxxx; MZBBSUC_2132_ticket=xxxxxx; MZBBS_2132_sid=xxxxxx; MZBBS_2132_ulastactivity=xxxxxx; MZBBS_2132_auth=xxxxxx; MZBBS_2132_loginmember=xxxxxx; MZBBS_2132_lastcheckfeed=xxxxxx; MZBBS_2132_checkfollow=xxxxxx; MZBBS_2132_lastact=xxxxxx;",
"draw_count": "1"
},
{
"meizu_cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)",
"draw_count": "多账号 抽奖次数设置"
}
],
"ZHIYOO_COOKIE_LIST": [
{
"zhiyoo_cookie": "ikdQ_9242_saltkey=xxxxxx; ikdQ_9242_lastvisit=xxxxxx; ikdQ_9242_onlineusernum=xxxxxx; ikdQ_9242_sendmail=1; ikdQ_9242_seccode=xxxxxx; ikdQ_9242_ulastactivity=xxxxxx; ikdQ_9242_auth=xxxxxx; ikdQ_9242_connect_is_bind=xxxxxx; ikdQ_9242_nofavfid=xxxxxx; ikdQ_9242_checkpm=xxxxxx; ikdQ_9242_noticeTitle=1; ikdQ_9242_sid=xxxxxx; ikdQ_9242_lip=xxxxxx; ikdQ_9242_lastact=xxxxxx"
},
{
"zhiyoo_cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"WEIBO_COOKIE_LIST": [
{
"weibo_show_url": "https://api.weibo.cn/2/users/show?wm=xxxxxx&launchid=xxxxxx&b=xxxxxx&from=xxxxxx&c=xxxxxx&networktype=xxxxxx&v_p=xxxxxx&skin=xxxxxx&v_f=xxxxxx&lang=xxxxxx&sflag=xxxxxx&ua=xxxxxx&ft=xxxxxx&aid=xxxxxx&has_extend=xxxxxx&uid=xxxxxx&gsid=xxxxxx&sourcetype=&get_teenager=xxxxxx&s=xxxxxx&has_profile=xxxxxx"
},
{
"weibo_show_url": "多账号 show_url 填写,请参考上面,show_url 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"DUOKAN_COOKIE_LIST": [
{
"duokan_cookie": "user_id=xxxxxx; token=xxxxxx; user_gender=xxxxxx; device_id=xxxxxx; app_id=xxxxxx; build=xxxxxx; short_version=xxxxxx"
},
{
"duokan_cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"CSDN_COOKIE_LIST": [
{
"csdn_cookie": "uuid_tt_dd=xxxxxx; _ga=xxxxxx; UserName=xxxxxx; UserInfo=xxxxxx; UserToken=xxxxxx; UserNick=xxxxxx; AU=768; UN=xxxxxx; BT=xxxxxx; p_uid=xxxxxx; Hm_up_6bcd52f51e9b3dce32bec4a3997715ac=xxxxxx; Hm_ct_6bcd52f51e9b3dce32bec4a3997715ac=xxxxxx; Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac=xxxxxx dc_sid=xxxxxx; c_segment=xxxxxx; dc_session_id=xxxxxx; csrfToken=xxxxxx; c_first_ref=xxxxxx; c_first_page=xxxxxx; c_page_id=xxxxxx; announcement-new=xxxxxx; log_Id_click=xxxxxx; c_pref=xxxxxx; c_ref=xxxxxx; dc_tos=xxxxxx; log_Id_pv=xxxxxx; log_Id_view=xxxxxx"
},
{
"csdn_cookie": "多账号 cookie 填写,请参考上面,cookie 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"WZYD_DATA_LIST": [
{
"wzyd_data": "areaId=xxxxxx&roleId=xxxxxx&gameId=xxxxxx&serverId=xxxxxx&gameOpenid=xxxxxx&userId=xxxxxx&appVersion=xxxxxx&cClientVersionName=xxxxxx&platid=xxxxxx&source=xxxxxx&algorithm=xxxxxx&version=xxxxxx&timestamp=xxxxxx&appid=xxxxxx&openid=xxxxxx&sig=xxxxxx&encode=2&msdkEncodeParam=xxxxxx&cSystem=xxxxxx&h5Get=xxxxxx&msdkToken=&appOpenid=xxxxxx"
},
{
"wzyd_data": "多账号 data 填写,请参考上面,data 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"WOMAIL_URL_LIST": [
{
"womail_url": "https://nyan.mail.wo.cn/cn/sign/index/index?mobile=xxxxxx&userName=&openId=xxxxxx"
},
{
"womail_url": "多账号 url 填写,请参考上面,url 以实际获取为准(遇到特殊字符如双引号\" 请加反斜杠转义)"
}
],
"HLX":
{
"user": "",
"password": ""
},
"163game":
{
"Authorization": ""
}
}

18
getENV.py

@ -1,18 +0,0 @@
import os
def getENv():
ql_new = '/ql/config/env.sh'
config_file = '/ql/config/check.json'
print('尝试检查环境\n')
if os.path.exists(ql_new):
print('成功 当前环境为青龙面板继续执行')
if os.path.exists(config_file):
print('已找到配置文件')
else:
print('未找到配置文件\n')
print('请添加/ql/config/check.json')
exit(1)
else:
print('失败 请检查环境')
exit(0)

245
utils.py

@ -0,0 +1,245 @@
import json
import os
import random
import re
import time
import traceback
# import tomli_w
from functools import wraps
import tomli
from checksendNotify import send
def toml_to_json(toml_path, to_json_path):
"""
:param toml_path: 需要转换的toml文件的路径
:param to_json_path: 需要输出的json文件路径
:return: NONE
"""
with open(toml_path, "rb") as f:
toml_dict = tomli.load(f)
json_date = json.dumps(toml_dict, indent=4, ensure_ascii=False)
with open(to_json_path, 'w', encoding="utf8") as s:
s.write(json_date)
# def json_to_toml(json_path, to_toml_path):
# with open(json_path, "r", encoding="utf8") as f:
# json_dict = json.load(f)
# with open(to_toml_path, "wb") as f:
# tomli_w.dump(json_dict, f)
class config_get(object):
def __init__(self, config_path=None):
"""
config_path: 自定义配置文件路径
config_file: 实际使用的配置文件路径
config_format: 实际使用的配置文件格式
"""
self.config_path = config_path
self.config_file = self.get_config_file()
self.config_format = self.get_config_format()
def get_config_format(self):
if self.config_file.endswith('.toml'):
return "toml"
else:
return "json"
def get_config_file(self):
ql_new = '/ql/config/env.sh'
json_config_file = '/ql/config/check.json'
toml_config_file = '/ql/config/check.toml'
print('开始检查环境\n')
if os.path.exists(ql_new):
print('成功 当前环境为青龙面板继续执行\n')
if self.config_path is not None:
print("使用了自定义路径的配置文件")
return self.config_path
elif os.path.exists(toml_config_file):
print("未使用自定义配置文件,开始从ql/config中检测")
print("检测到toml格式配置文件\n")
return toml_config_file
elif os.path.exists(json_config_file):
print("检测到json格式配置文件\n")
return json_config_file
else:
print("未检测到配置文件,程序退出")
exit(1)
else:
print('失败 请检查环境')
exit(0)
return 0
def get_real_key(self, expression):
"""
从配置文件中获取re表达式想要的KEY
:return:
"""
pattern = re.compile(expression, re.I)
real_key = ''
if self.config_format == "toml":
for key in self.get_key_for_toml(self.config_file):
if pattern.match(key) is not None:
real_key = key
else:
for key in self.get_key_for_json(self.config_file):
if pattern.match(key) is not None:
real_key = key
if real_key is not '':
return real_key
else:
print("啊哦没有找到")
exit(1)
def get_value(self, expression):
real_key = self.get_real_key(expression)
if self.config_format == "toml":
return self.get_value_for_toml(self.config_file, real_key)
else:
return self.get_value_for_json(self.config_file, real_key)
@staticmethod
def get_value_for_toml(toml_path, key):
with open(toml_path, "rb") as f:
try:
toml_dict = tomli.load(f)
return toml_dict.get(key)
except tomli.TOMLDecodeError:
print(
f"错误:配置文件 {toml_path} 格式不对,请学习 https://toml.io/cn/v1.0.0\n错误信息:\n{traceback.format_exc()}"
)
exit(1)
@staticmethod
def get_value_for_json(json_path, key):
with open(json_path, "r", encoding="utf8") as f:
try:
json_dict = json.load(f)
return json_dict.get(key)
except json.decoder.JSONDecodeError:
print(f"错误:配置文件 {json_path} 格式不对,错误信息{traceback.format_exc()}")
@staticmethod
def get_key_for_toml(toml_path):
with open(toml_path, "rb") as f:
try:
toml_dict = tomli.load(f)
return toml_dict.keys()
except tomli.TOMLDecodeError:
print(
f"错误:配置文件 {toml_path} 格式不对,请学习 https://toml.io/cn/v1.0.0\n错误信息:\n{traceback.format_exc()}"
)
exit(1)
@staticmethod
def get_key_for_json(json_path):
with open(json_path, "r", encoding="utf8") as f:
try:
json_dict = json.load(f)
return json_dict.keys()
except json.decoder.JSONDecodeError:
print(f"错误:配置文件 {json_path} 格式不对,错误信息{traceback.format_exc()}")
class check(object):
def __init__(self, run_script_name, run_script_expression, Configuration_flag=False):
"""
:param run_script_name: 执行脚本的说明
:param run_script_expression: 需要获取的配置键的re表达式
:param Configuration_flag: 是否只检测True或False(默认为False)
"""
self.run_script_name = run_script_name
self.run_script_expression = run_script_expression
self.Configuration_flag = Configuration_flag
@staticmethod
def other_task():
change_db()
def __call__(self, func):
@wraps(func)
def wrapper(*args, **kwargs):
if not self.Configuration_flag:
config = config_get()
value_list = config.get_value(self.run_script_expression)
Push_message = ""
num = 1
for value in value_list:
print(f"<----------------账号【{num}】---------------->")
print(f"获取到的账号信息为:{value}\n")
num += 1
try:
result = func(value=value)
print(f"执行结果:\n{result}")
Push_message += result
except IndexError:
print("可能是示例格式被运行\n错误信息:")
print(f"{traceback.format_exc()}")
Push_message += ''
except AttributeError:
print("可能是配置文件的键名出现问题\n"
"例如:在此次更新中什么值得买的键名从smzdm_cookie变成了cookie\n")
print(f"{traceback.format_exc()}")
Push_message += ''
except TypeError:
print(f"{traceback.format_exc()}")
Push_message += ''
send(self.run_script_name, Push_message)
else:
config = config_get()
flag = config.get_value(self.run_script_expression)
if flag is not None and flag:
print(f"开始执行{self.run_script_name}")
func()
else:
print(f"设置为不执行{self.run_script_name}")
return wrapper
@check(run_script_name="随机定时", run_script_expression="QL_RANDOM_TIME", Configuration_flag=True)
def change_db():
lines = []
first = True
with open("/ql/db/crontab.db", "r", encoding="UTF-8") as f:
for i in f.readlines():
if (
i.find("yuxian158_check_master") != -1
and i.find("ran_time") == -1
):
record = json.loads(i)
if record.get("isDisabled") == 0:
if (
i.find("motto") != -1
or i.find("leetcode") != -1
or i.find("weather") != -1
or i.find("news") != -1
):
record["schedule"] = change_time(record["schedule"], True)
else:
record["schedule"] = change_time(record["schedule"], first)
if first:
first = False
lines.append(json.dumps(record, ensure_ascii=False) + "\n")
else:
lines.append(i)
time_str = time.strftime("%Y-%m-%d", time.localtime())
os.system(f"copy /ql/db/crontab.db /ql/db/crontab.db.{time_str}.back")
with open("/ql/db/crontab.db", "w", encoding="UTF-8") as f:
f.writelines(lines)
def change_time(time_str: str, first: bool):
words = re.sub("\\s+", " ", time_str).split()
if first:
words[0] = str(random.randrange(0, 60, step=5))
words[1] = str(random.randrange(8, 9))
else:
words[0] = str(random.randrange(60))
words[1] = str(random.randrange(22))
return " ".join(words)
Loading…
Cancel
Save