中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python實現T00ls自動簽到的方法

發布時間:2020-07-07 11:27:39 來源:億速云 閱讀:285 作者:清晨 欄目:開發技術

小編給大家分享一下Python實現T00ls自動簽到的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

T00ls 每日簽到是可以獲取 TuBi 的,由于常常忘記簽到,導致損失了很多 TuBi 。于是在 T00ls 論壇搜索了一下,發現有不少大佬都寫了自己的簽到腳本,簽到功能實現、定時任務執行以及簽到提醒的方式多種多樣,好羨慕啊。所以這里國光也嘗試借鑒前輩們的腳本,嘗試整合一個自己的自動簽到腳本,因為國光有自己的服務器,所以打算使用 Linux 下的 crontab 來定時執行任務,提醒的話使用釘釘和郵件提醒基本上可以滿足我的使用需求了,話不多說,下面開始腳本的編寫吧。

基礎簽到

寫代碼功能得慢慢添加上去,首先得實現一個最基礎的登錄并簽到功能,后續再添加郵件以及釘釘提醒等功能。

因為腳本功能比較簡單,就直接將對應的功能封裝成函數了。對應的函數都按照正規開發那樣給了詳細的注釋和說明,話不多說直接看下面的代碼吧:

import json
import requests
username = '國光' # 帳號
password = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' # 密碼MD5 32位(小寫)
question_num = 5 # 安全提問 參考下面
question_answer = 'xxx' # 安全提問答案
# 0 = 沒有安全提問
# 1 = 母親的名字
# 2 = 爺爺的名字
# 3 = 父親出生的城市
# 4 = 您其中一位老師的名字
# 5 = 您個人計算機的型號
# 6 = 您最喜歡的餐館名稱
# 7 = 駕駛執照的最后四位數字
def t00ls_login(u_name, u_pass, q_num, q_ans):
 """
 t00ls 登錄函數
 :param u_name: 用戶名
 :param u_pass: 密碼的 md5 值 32 位小寫
 :param q_num: 安全提問類型
 :param q_ans: 安全提問答案
 :return: 簽到要用的 hash 和 登錄后的 Cookies
 """
 login_data = {
  'action': 'login',
  'username': u_name,
  'password': u_pass,
  'questionid': q_num,
  'answer': q_ans
 }
 response_login = requests.post('https://www.t00ls.net/login.json', data=login_data)
 response_login_json = json.loads(response_login.text)
 if response_login_json['status'] != 'success':
  return None
 else:
  print('用戶:', username, '登入成功!')
  formhash = response_login_json['formhash']
  t00ls_cookies = response_login.cookies
  return formhash, t00ls_cookies
def t00ls_sign(t00ls_hash, t00ls_cookies):
 """
 t00ls 簽到函數
 :param t00ls_hash: 簽到要用的 hash
 :param t00ls_cookies: 登錄后的 Cookies
 :return: 簽到后的 JSON 數據
 """
 sign_data = {
  'formhash': t00ls_hash,
  'signsubmit': "true"
 }
 response_sign = requests.post('https://www.t00ls.net/ajax-sign.json', data=sign_data, cookies=t00ls_cookies)
 return json.loads(response_sign.text)
def main():
 response_login = t00ls_login(username, password, question_num, question_answer)
 if response_login:
  response_sign = t00ls_sign(response_login[0], response_login[1])
  if response_sign['status'] == 'success':
   print('簽到成功')
  elif response_sign['message'] == 'alreadysign':
   print('今日已簽到')
  else:
   print('出現玄學問題了 簽到失敗')
 else:
  print('登入失敗 請檢查輸入資料是否正確')
if __name__ == '__main__':
 main()

值得一提的是,T00ls 得連續 2 天簽到才會有 TuBi 獎勵。

查詢域名獎勵

T00ls 在線工具里面有域名查詢功能,每天查詢域名的話也會獲得 1 個 TuBi 的獎勵,這樣算下來每天可獲得 2 個 TuBi 的獎勵,1個月就是 60 TuBi 的獎勵,1 年下來就是 720 TuBi 的獎勵……. 瞬間感覺自己變得很壕了

Python實現T00ls自動簽到的方法

然后去 TuBi 日志里面是可以看到查詢域名的記錄的:

Python實現T00ls自動簽到的方法

但是這個域名查詢有要求的,咨詢了下 T00ls 的 MoR03r 大佬:

Python實現T00ls自動簽到的方法

所以我們需要每天查詢一個論壇里面沒有記錄的域名才可以,所以得多寫一個流程了。下面直接貼查詢域名的代碼吧:

def t00ls_domain(t00ls_hash, t00ls_cookies):
 # 使用站長之家查詢今天注冊的域名
 start_time = time.time()
 china_url = 'https://whois.chinaz.com/suffix'
 search_data = 'ix=.com&suffix=.cn&c_suffix=&time=1&startDay=&endDay='
 req_headers['Content-Type'] = 'application/x-www-form-urlencoded'
 response_domains = requests.post(url=china_url, headers=req_headers, data=search_data, timeout=10)
 soup = BeautifulSoup(response_domains.text, 'html.parser')
 # Bs4 解析器 簡單規則過濾一下放入到 domains 的列表中
 domains = []
 for i in soup.select('.listOther a'):
  if '.' in i.string and '*' not in i.string:
   domains.append(i.string)
 domain = random.sample(domains, 1)[0] # 隨機抽取一個 幸運兒
 end_time = time.time()
 print(f'站長之家隨機找域名耗時: {end_time - start_time:.4f}秒')

 start_time = time.time()
 query_url = 'https://www.t00ls.net/domain.html'
 query_data = f'domain={domain}&formhash={t00ls_hash}&querydomainsubmit=%E6%9F%A5%E8%AF%A2'
 query_status = False

 # 如果 t00ls 查詢沒有成功的話 就一直查詢
 while not query_status:
  domain = random.sample(domains, 1)[0] # 隨機抽取一個 幸運兒
  query_data = f'domain={domain}&formhash={t00ls_hash}&querydomainsubmit=%E6%9F%A5%E8%AF%A2'

  try:
   response_query = requests.post(url=query_url, headers=req_headers, data=query_data, cookies=t00ls_cookies)
  except Exception as e:
   pass

  if domain in response_query.text:
   print('t00ls 查詢域名成功')
   response_tb = requests.get('https://www.t00ls.net/members-tubilog.json', cookies=t00ls_cookies)
   if domain in response_tb.text:
    print('查詢域名 TuBi + 1')
    query_status = True
   else:
    print('糟糕 域名查詢成功 但是 TuBi 沒有增加 可能域名重復了')
    print('隨機延時 5-10 秒,繼續查詢...')
    time.sleep(random.randint(5, 10))
  else:
   print(f'查詢失敗?失敗的域名是: {domain}')
   print('隨機延時 5-10 秒,繼續查詢...')
   time.sleep(random.randint(5, 10))

 end_time = time.time()
 print(f't00ls 域名查詢耗時: {end_time - start_time:.4f}秒')

域名查詢使用了站長之家的域名服務,查詢服務速度還算是可以的,但是 t00ls 查詢域名服務不是很穩定,所以國光我這里寫了 while 循環一直查詢,當然查詢失敗了是需要延時的,國光隨機延時了 5-10 秒 用來減輕 t00ls 服務器的負擔,大家腳本拿去用的話,建議依然保持這個延時,做一個素質良好的爬蟲。

Python實現T00ls自動簽到的方法

代碼中基本上考慮到了各種情況,包括域名查詢超時以及查詢域名以及重復等問題。

Python實現T00ls自動簽到的方法

查詢域名功能寫完了感覺溜了溜了,一直在查詢,萬一被拉黑名單就尷尬了,下面來研究如何接入釘釘吧。

釘釘接入

酷公司用釘釘,很巧我們公司也用釘釘,那么現在嘗試將腳本接入釘釘提醒服務。

機器人只能在群聊中添加,所以在之前你得有一個自己的一個用于接收機器人通知的群。如果沒有群怎么辦?手動端可以通過「發起群聊」-「選人建群」-「面對面建群」創建一個自己的群,哪怕群成員只有你 1 個人也是 OK 的。

在釘釘的「機器人管理」中我們可以添加一個自定義機器人,通過 Webhook 接入也比較方便:

Python實現T00ls自動簽到的方法

然后將機器人添加到之前新建的群中,可以自定義關鍵字(自定義關鍵詞后 傳入 webhook 的內容必須有關鍵詞 否則無法傳入信息):

Python實現T00ls自動簽到的方法

接著就會生成一串 token 地址,復制出來以備用:

Python實現T00ls自動簽到的方法

詳細的釘釘自定義機器人文檔可參考: 釘釘開發文檔

國光這里就打算用最基礎的 text 文本類型:

{
 "msgtype": "text", 
 "text": {
  "content": "我就是我, 是不一樣的煙火"
 }, 
 "at": {
  "atMobiles": [
   "177******30", 
  ], 
  "isAtAll": false
 }
}

當然也可以不需要用 @ 功能,下面是國光寫的最基礎的 Demo:

import json
import requests

webhook = 'https://oapi.dingtalk.com/robot/send?access_token={你的機器人的token}'

dd_headers = {
  "Content-Type": "application/json",
  "Charset": "UTF-8"
}

dd_message = {
  "msgtype": "text",
  "text": {
   "content": '通知:Hello World'
  }
 }

r = requests.post(url=webhook, headers=dd_headers, data=json.dumps(dd_message))
print(r.text)

最后的效果如下:

Python實現T00ls自動簽到的方法

郵件接入

郵件接入這里選取了 QQ 郵箱作為案例,首先需要開啟 POP3/SMTP 服務,然后點擊生成授權碼:

Python實現T00ls自動簽到的方法

生成的這個授權碼實際上就起到密碼的作用,所以不要隨便外泄:

Python實現T00ls自動簽到的方法

下面是完整的Python 調用郵件的 Demo 代碼,填寫對應的信息之后可以直接運行:

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

sender = 'admin@sqlsec.com' # 發件人郵箱賬號
sender_pass = '***********' # 發件人郵箱密碼
receiver = 'admin@sqlsec.com' # 收件人郵箱賬號
content = '郵件正文內容'

try:
 msg = MIMEText(content, 'plain', 'utf-8')
 msg['From'] = formataddr(["T00ls 簽到提醒", sender]) # 括號里的對應發件人郵箱昵稱、發件人郵箱賬號
 msg['To'] = formataddr(["", receiver]) # 括號里的對應收件人郵箱昵稱、收件人郵箱賬號
 msg['Subject'] = "Python 發送郵件測試" # 郵件的主題,也可以說是標題

 server = smtplib.SMTP_SSL("smtp.qq.com", 465)
 server.login(sender, sender_pass) # 括號中對應的是發件人郵箱賬號、郵箱密碼
 server.sendmail(sender, [receiver, ], msg.as_string()) # 括號中對應的是發件人郵箱賬號、收件人郵箱賬號、發送郵件
 server.quit() # 關閉連接
 print("郵件發送成功")
except Exception:
 print("郵件發送失敗")

功能整合

項目地址: https://github.com/sqlsec/TuBi

我們實現了釘釘和郵件的 Demo 之后,現在嘗試來進行最終的功能整合吧,完整的代碼如下:

import time
import json
import random
import smtplib
import requests
from bs4 import BeautifulSoup
from email.mime.text import MIMEText
from email.utils import formataddr

# t00ls 賬號配置
username = '國光' # 帳號
password = '***' # 密碼MD5 32位(小寫)
question_num = 7 # 安全提問 參考下面
question_answer = '***' # 安全提問答案

# 0 = 沒有安全提問
# 1 = 母親的名字
# 2 = 爺爺的名字
# 3 = 父親出生的城市
# 4 = 您其中一位老師的名字
# 5 = 您個人計算機的型號
# 6 = 您最喜歡的餐館名稱
# 7 = 駕駛執照的最后四位數字

# 選擇提醒方式
notice = 2 # 0 = 釘釘 1 = 郵件 2 = 我全都要

# 如果選擇釘釘通知的話 請配置下方信息
webhook = 'https://oapi.dingtalk.com/robot/send?access_token=***' # 釘釘機器人的 webhook

# 如果選擇郵件通知的話 請配置下方信息
sender = 'admin@sqlsec.com' # 發件人郵箱賬號
sender_pass = '***********' # 發件人郵箱密碼
receiver = 'admin@sqlsec.com' # 收件人郵箱賬號

req_headers = {
 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36'
}

def t00ls_login(u_name, u_pass, q_num, q_ans):
 """
 t00ls 登錄函數
 :param u_name: 用戶名
 :param u_pass: 密碼的 md5 值 32 位小寫
 :param q_num: 安全提問類型
 :param q_ans: 安全提問答案
 :return: 簽到要用的 hash 和 登錄后的 Cookies
 """

 login_data = {
  'action': 'login',
  'username': u_name,
  'password': u_pass,
  'questionid': q_num,
  'answer': q_ans
 }
 response_login = requests.post('https://www.t00ls.net/login.json', data=login_data, headers=req_headers)
 response_login_json = json.loads(response_login.text)

 if response_login_json['status'] != 'success':
  return None
 else:
  print('用戶:', username, '登入成功!')
  formhash = response_login_json['formhash']
  t00ls_cookies = response_login.cookies
  return formhash, t00ls_cookies


def t00ls_sign(t00ls_hash, t00ls_cookies):
 """
 t00ls 簽到函數
 :param t00ls_hash: 簽到要用的 hash
 :param t00ls_cookies: 登錄后的 Cookies
 :return: 簽到后的 JSON 數據
 """
 sign_data = {
  'formhash': t00ls_hash,
  'signsubmit': "true"
 }
 response_sign = requests.post('https://www.t00ls.net/ajax-sign.json', data=sign_data, cookies=t00ls_cookies,
         headers=req_headers)
 return json.loads(response_sign.text)


def t00ls_domain(t00ls_hash, t00ls_cookies):
 """
 t00ls 域名查詢函數
 :param t00ls_hash: 簽到要用的 hash
 :param t00ls_cookies: 登錄后的 Cookies
 :return: 查詢相關的日志信息
 """
 content = ''
 # 使用站長之家查詢今天注冊的域名
 start_time = time.time()

 china_url = 'https://whois.chinaz.com/suffix'
 search_data = 'ix=.com&suffix=.cn&c_suffix=&time=1&startDay=&endDay='
 req_headers['Content-Type'] = 'application/x-www-form-urlencoded'
 response_domains = requests.post(url=china_url, headers=req_headers, data=search_data, timeout=10)

 # Bs4 解析器 簡單規則過濾一下放入到 domains 的列表中
 soup = BeautifulSoup(response_domains.text, 'html.parser')
 domains = []
 for i in soup.select('.listOther a'):
  if '.' in i.string and '*' not in i.string:
   domains.append(i.string)
 domain = random.sample(domains, 1)[0] # 隨機抽取一個 幸運兒

 end_time = time.time()
 print(f'站長之家隨機找域名耗時: {end_time - start_time:.4f}秒')
 content += f'\n站長之家隨機找域名耗時: {end_time - start_time:.4f}秒\n\n'

 start_time = time.time()

 query_url = 'https://www.t00ls.net/domain.html'
 query_data = f'domain={domain}&formhash={t00ls_hash}&querydomainsubmit=%E6%9F%A5%E8%AF%A2'
 query_status = False
 query_count = 1 # 查詢重試次數

 # 如果 t00ls 查詢沒有成功的話 就一直查詢
 while not query_status and query_count < 4:
  domain = random.sample(domains, 1)[0] # 隨機抽取一個 幸運兒
  query_data = f'domain={domain}&formhash={t00ls_hash}&querydomainsubmit=%E6%9F%A5%E8%AF%A2'

  try:
   response_query = requests.post(url=query_url, headers=req_headers, data=query_data, cookies=t00ls_cookies)
  except Exception:
   pass

  if domain in response_query.text:
   response_tb = requests.get('https://www.t00ls.net/members-tubilog.json', cookies=t00ls_cookies)
   if domain in response_tb.text:
    print('查詢域名成功 TuBi + 1 \n')
    content += '查詢域名成功 TuBi + 1\n'
    query_status = True
   else:
    print('糟糕 域名查詢成功 但是 TuBi 沒有增加 可能域名重復了')
    content += '糟糕 域名查詢成功 但是 TuBi 沒有增加 可能域名重復了\n'
    query_count += 1
    print(f'隨機延時 5-10 秒,繼續第 {query_count} 次查詢')
    content += f'隨機延時 5-10 秒,繼續第 {query_count} 次查詢\n\n'
    time.sleep(random.randint(5, 10))
  else:
   print(f'查詢失敗?失敗的域名是: {domain}')
   content += f'查詢失敗?失敗的域名是: {domain}\n'
   query_count += 1
   print(f'隨機延時 5-10 秒,繼續第 {query_count} 次查詢')
   content += f'隨機延時 5-10 秒,繼續第 {query_count} 次查詢\n\n'
   time.sleep(random.randint(5, 10))
  if query_count == 4:
   print('重試查詢次數已達上限 終止查詢')
   content += '重試查詢次數已達上限 終止查詢\n\n'

 end_time = time.time()
 print(f't00ls 域名查詢耗時: {end_time - start_time:.4f}秒')
 content += f't00ls 域名查詢耗時: {end_time - start_time:.4f}秒\n'
 return content


def dingtalk(content):
 """
 釘釘通知函數
 :param content: 要通知的內容
 :return: none
 """
 webhook_url = webhook
 dd_headers = {
  "Content-Type": "application/json",
  "Charset": "UTF-8"
 }
 dd_message = {
  "msgtype": "text",
  "text": {
   "content": f'T00ls 簽到通知\n{content}'
  }
 }

 r = requests.post(url=webhook_url, headers=dd_headers, data=json.dumps(dd_message))


def mail(content):
 """
 郵件通知函數
 :param content: 要通知的內容
 :return: none
 """
 msg = MIMEText(content, 'plain', 'utf-8')
 msg['From'] = formataddr(["T00ls 簽到提醒", sender])
 msg['To'] = formataddr(["", receiver])
 msg['Subject'] = "T00ls 每日簽到提醒"

 server = smtplib.SMTP_SSL("smtp.qq.com", 465)
 server.login(sender, sender_pass)
 server.sendmail(sender, [receiver, ], msg.as_string())
 server.quit()


def main():
 content = ''
 response_login = t00ls_login(username, password, question_num, question_answer)
 if response_login:
  response_sign = t00ls_sign(response_login[0], response_login[1])
  if response_sign['status'] == 'success':
   print('簽到成功 TuBi + 1')
   content += '\n簽到成功 TuBi + 1\n'

   verbose_log = t00ls_domain(response_login[0], response_login[1])
   content += verbose_log

   if notice == 0:
    try:
     dingtalk(content)
    except Exception:
     print('請檢查釘釘配置是否正確')
   elif notice == 1:
    try:
     mail(content)
    except Exception:
     print('請檢查郵件配置是否正確')
   else:
    try:
     dingtalk(content)
    except Exception:
     print('請檢查釘釘配置是否正確')
    try:
     mail(content)
    except Exception:
     print('請檢查郵件配置是否正確')
  elif response_sign['message'] == 'alreadysign':
   print('已經簽到過啦')
   content += '\n已經簽到過啦\n'

   verbose_log = t00ls_domain(response_login[0], response_login[1])
   content += verbose_log

   if notice == 0:
    try:
     dingtalk(content)
    except Exception:
     print('請檢查釘釘配置是否正確')
   elif notice == 1:
    try:
     mail(content)
    except Exception:
     print('請檢查郵件配置是否正確')
   else:
    try:
     dingtalk(content)
    except Exception:
     print('請檢查釘釘配置是否正確')
    try:
     mail(content)
    except Exception:
     print('請檢查郵件配置是否正確')
  else:
   print('出現玄學問題了 簽到失敗')
 else:
  print('登入失敗 請檢查輸入資料是否正確')

if __name__ == '__main__':
 main()

最終整合的代碼看上去就不是那么優雅的… 看來還是正如古人說的那樣:“有善始者實繁,能克終者蓋寡” 啊。

不管這么多了,以后有機會再來改進代碼吧,下面直接看效果圖:

Python實現T00ls自動簽到的方法

Python實現T00ls自動簽到的方法

因為國光我今天簽到并查詢過了,所以圖片上看的都是失敗的。

定時任務

看了不少網友使用了 騰訊云函數Github 自帶的 Actions 來實現自動觸發腳本,的確也很不錯,感興趣的朋友也可研究看看。因為國光我有一臺 Web 服務器,所以國光我就采用了在 Linux 下使用原生的 crontab 命令實現定時任務了:

# 查看定時任務
crontab -l

# 編輯定時任務
crontab -e

編輯定時任務,一行一個任務,國光我本次填寫的內容如下:

30 9 * * * /usr/bin/python3 /root/code/t00ls/TuBi.py>&1

表示每天 9:30 自動運行下面的命令:

/usr/bin/python3 /root/code/t00ls/TuBi.py

這樣看起來是不是很簡單呢,如果語法沒有問題的話,會得到如下提示:

crontab: installing new crontab

這表示新建定時任務成功,后面就可以躺著賺去每天的 2 個 TuBi 了。

這個腳本雖然并沒有啥難度,但是還是比實用的。釘釘的 webhook 調用也很方便,以后再也其他類似腳本的話就可以少走一些彎路了,總之不論是開發還是安全都有很長的路要走,路漫漫其修遠兮,吾將上下而求索,共勉 !

看完了這篇文章,相信你對Python實現T00ls自動簽到的方法有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蕉岭县| 乃东县| 大英县| 张北县| 繁昌县| 青海省| 常山县| 明水县| 通辽市| 遂宁市| 屏东县| 樟树市| 吉木萨尔县| 灌云县| 昭苏县| 新建县| 万盛区| 白银市| 安吉县| 铜山县| 工布江达县| 肇东市| 淮南市| 建湖县| 金山区| 湖北省| 株洲县| 赣州市| 伊春市| 高清| 稻城县| 钦州市| 尉氏县| 农安县| 新晃| 锦屏县| 大余县| 沙田区| 湘乡市| 定襄县| 沅江市|