PythonはT 00 lsが自動的にスクリプトコードに署名することを実現します。(メール+釘付け通知)


T 00 lsは毎日署名してTuBiを得ることができて、いつも署名することを忘れて、多くのTuBiを損失しました。T 00 lsフォーラムで検索してみると、多くのオーディエンスが自分のサインを台本に書いていて、機能の実現、タイミングタスクの実行、およびリマインドにサインする方法が多様で、羨ましいです。だからここの国光も先輩達の脚本を参考にして、自分の自動署名台本を統合してみました。国光は自分のサーバーがあるので、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()
ちなみに、T 00 lsは2日間連続して署名しないとTuBi奨励がありません。
ドメインの奨励
T 00 lsオンラインツールにはドメイン名の検索機能があり、ドメイン名を毎日調べても1つのTuBiの奨励が得られます。これを計算すると、毎日2つのTuBiの奨励が得られます。1ヶ月は60 TuBiの奨励です。1年間で720 TuBiの奨励があります。瞬く間に自分がとても汚いと感じました。

そしてTuBiのログに行くとドメイン名の確認記録が見られます。

しかし、このドメイン名の検索には要求があります。T 00 lsのMoR 03 rオーディナに聞いてみました。

だから、私たちは毎日一つのフォーラムに記録されていないドメイン名を調べなければなりません。だから、もう一つのプロセスを書きます。以下は直接ドメイン名を検索するコードを貼り付けましょう。

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} ')
ドメイン名の検索は駅長のドメイン名サービスを使っています。検索サービスの速度はまだ大丈夫です。しかし、t 00 lsのドメイン名検索サービスはあまり安定していません。だから国光はここでwhileループを書いてずっと調べています。もちろん、検索が失敗したら延長が必要です。国光はランダムに5-10秒遅延してt 00 lsサーバーの負担を軽減します。依然としてこの遅延を維持して、素質の良い爬虫類を作ることを提案します。

コードは基本的にドメインクエリのタイムアウトとドメイン名の検索と重複など、さまざまな状況を考慮しています。

ドメイン名の検索機能が書き終わりました。滑りました。ずっと調べています。もしブラックリストを引っ張られたら困ります。以下はどうやってピンに接続するかを研究しましょう。
ピン接続
クール社は釘付けを使っています。当社も釘付けを使っています。脚本を釘付けに接続して注意喚起サービスを試しています。
ロボットは雑談にしか追加できませんので、ロボットの通知を受けるために自分のグループが必要です。群れがないならどうすればいいですか?手動端末は「発起群雑談」-「人選群」-「対面群」を通じて自分の群を作成できます。たとえグループメンバーがあなた一人でもOKです。
ピンの「ロボット管理」にはカスタムロボットを追加できます。Webhookでアクセスするのも便利です。

その後、新しいグループにロボットを追加して、ユーザー定義のキーワード(ユーザー定義のキーワードが入ってきたらwebhookの内容にキーワードが必要です。そうでなければ、情報が入ってきません。):

その後、一連のtokenアドレスを生成し、予備としてコピーする。

詳細な釘付けは、カスタムロボットドキュメントを参考にしてください。
国光はここで一番基本的なテキストタイプを使うつもりです。

{
 "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)
最後の効果は以下の通りです。

メールアクセス
メールのアクセスはここでQQメールボックスを判例として選びました。まずPOP 3/SMTPサービスをオープンして、それからクリックして許可コードを生成します。

生成されたこの授権コードは実際にパスワードの役割を果たしますので、みだりに外部に漏らさないでください。

以下は完全なPythonでメールのDemoコードを呼び出します。対応する情報を記入してから直接実行できます。

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

sender = '[email protected]' #        
sender_pass = '***********' #        
receiver = '[email protected]' #        
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
釘付けとメールのデモを実現した後、最終的な機能統合を試みてみます。完全なコードは以下の通りです。

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 = '[email protected]' #        
sender_pass = '***********' #        
receiver = '[email protected]' #        

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'
: {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 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
') content += ' TuBi + 1
' query_status = True else: print(' TuBi ') content += ' TuBi
' query_count += 1 print(f' 5-10 , {query_count} ') content += f' 5-10 , {query_count}

' time.sleep(random.randint(5, 10)) else: print(f' ? : {domain}') content += f' ? : {domain}
' query_count += 1 print(f' 5-10 , {query_count} ') content += f' 5-10 , {query_count}

' time.sleep(random.randint(5, 10)) if query_count == 4: print(' ') content += '

' end_time = time.time() print(f't00ls : {end_time - start_time:.4f} ') content += f't00ls : {end_time - start_time:.4f}
' 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
{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 += '
TuBi + 1
' 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 += '

' 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()
最終的に統合されたコードはそんなに優雅ではないように見えますが、やはり昔の人が言ったように、「有善の始まりは実に多く、有終の者は寡婦である」ということですね。
こんなに多くなっても、後でコードを改善する機会があります。直接に効果図を見ます。


国光は今日サインして調べましたので、写真で見たのは全部失敗しました。
タイム?タスク
多くのネット友達が騰訊雲関数とGithubが持っているアクションを使って自動触発シナリオを実現しているのを見ました。確かにいいです。興味がある友達も研究してみてください。国光はウェブサーバーを持っていますので、国光はLinuxで原生のcrontab命令を使って定時任務を達成しました。

#       
crontab -l

#       
crontab -e
定時任務を編集して、一つの任務を行います。国光は今回記入した内容は以下の通りです。
30 9*/usr/bin/python 3/root/code/t 00 ls/TuBi.py>&1
毎日9:30に次のコマンドが自動的に実行されることを示します。
/usr/bin/python 3/root/code/t 00 ls/TuBi.py
これは簡単に見えますか?文法に問題がなければ、次のように注意されます。
crontab:installing new crontab
これは新しい定时任务が成功したことを表して、后で横たわって毎日の2つのTuBiを储けることができます。
締め括りをつける
この脚本はあまり難しくないですが、実用的です。釘付けのwebhookの呼び出しも便利です。これからもスクリプトのようなものがあれば、回り道を少なくしてもいいです。つまり、開発でも安全でも、長い道のりがあります。
ここでPythonについてT 00 lsが自動的にスクリプト(メール+釘付け通知)に署名した文章を紹介します。これに関連してpythonが自動的に脚本の内容に署名しています。以前の文章を検索してください。または下記の関連記事を引き続きご覧ください。これからもよろしくお願いします。