見出し画像

pythonで条件付きリツイートをする ~ツイッター社の言論弾圧に対抗するために~

■イントロ

こんにちは。びりぶです。


今、ネットにおける言論弾圧が進んでいます。ネットの世界を牛耳ろうとしている上級国民たちは、自分たちに都合の悪い情報を拡散する庶民の言論を弾圧するため、ほぼ強制的に言論統制を進めようとしています。そんな悪に少しでも対抗するため、ツイッターのリツイートプログラムを作ったので、情報共有します。

コードだけ見たい方は、「条件付きリツイートプログラム」以降へ飛んでください。

「この記事を読んでわかること」
 ・ツイッター社の言論弾圧の実例
 ・リツイートプログラムのpythonコード
 ・言論弾圧に対して、どう行動すればいいか



■ネットにおける言論弾圧

ネットにおける言論弾圧の例を少し挙げてみました。

トランプ氏はツイッターで、「共和党は、ソーシャルメディアプラットフォームが保守派の声を完全に遮断しようとしていると感じている。こんなことが現実になる前に、われわれは(各種プラットフォームを)強く規制するか、あるいは閉鎖するだろう」と主張した。
https://www.afpbb.com/articles/-/3285236
中国、SNSでも言論弾圧 投稿した6人の市民が逮捕された
https://www.epochtimes.jp/p/2018/03/31888.html
ネット発信者特定へ制度改正検討
木村花さん死去で総務相が意向
https://this.kiji.is/637834364545696865
松井一郎大阪市長 SNSの誹謗中傷に「大バカ者を無くす為にとっとと法制化して下さい」と国に訴え
元大阪府知事の弁護士・橋下徹氏(50)も反応。ツイッターで「この元ツイートを単純リツイートした人たちは、直ちに削除しておいた方が法的に安全です」
https://news.yahoo.co.jp/articles/50c80d36eecb701f1a945baa0209c3bccb13a3b1

少し前までは、ネット上に工作員を多数配置しトレンドを操作し、正論が少数派であるような工作活動をする程度でしたが、最近では法的措置をとるなど、強制的な言論弾圧が進めらています。



■ネットにおける言論弾圧の実例

実際に、私が目にした実例を挙げてみました。


--①ツイッター社によるフォロワー数の操作--

以下は「時計仕掛けのオレンジ」氏のアカウントで何度も起こっている事象です。

「時計仕掛けのオレンジ」氏は、この世の隠された真実を拡散されており、ツイッター社にとっては都合の悪い情報をたくさんツイートされているようです。そのため、フォロワー数を減らされています。そして、減らされた事象をツイートすると、その時だけフォロワー数が増えるという、不思議な現象が何度も起こっています。
恐らく、ツイッター社は自在にフォロワー数を操作できるのでしょう。


--②ツイッター社によるリツイート外し--

今回のプログラムコードを書くキッカケになった事象です。
「いいね」や「リツイート」が反応しない、知らない間に消されているという事象が各所で起こっているようです。
一方で、真実を拡散する人たちにとっては、それが拡散されてほしくない情報なのだと、いう事がわかります。ツイッター社は、リツイート外しにより、墓穴を掘っていることがわからないようです。


「外されるのなら、もう一度リツイートしよう。」「外されたリツイートが拡散されたくない情報なら、もう一度リツイートしよう。」
そんな動機で作ってみました。



--③トレンド件数の非表示--

2020/6/26から、トレンドに件数が表示されない仕様に変わったようです。皆さん、気づかれていましたか?

トレンドって、件数が上位のものから上に表示されて、世の中の注目ニュースなど知るためのものだと思うのですが、、、、
件数が表示されない時点で、トレンドの意味を成さない仕様になっています。
つまり、多くの人が目にするトレンドも、ツイッター社によって、自由に操作できるということです。


特に、ツイッター社による言論弾圧は、取締役が李・飛飛(リ・フェイフェイ)に変わってから顕著になりました。


彼女は、北京産まれ、アメリカ在住、プリンストン大学出身で、長年グーグルに勤め、AIと機械学習のチーフサイエンティストとして活躍した人です。AIの世界では知らない人がいないほどの有名人。

有名人には、裏があるというのはラプト理論通りですね。



--④YouTube再生回数の操作--


まずは、以下の動画を見てください。

「KAWATAとNANAのRAPT理論」にて最初にアップされた動画の再生回数が、「969回」から「966回」に減らされています。

たった3回ですが、それでも意図的に減らされたことは明らかです。

上記は、2019/2の動画でしたが、2020/5の最近の動画(下記)では、1000回以上も再生回数が減らされています。回数の問題ではないですが、言論弾圧がどんどん過激になっていることがわかります。


--⑤グーグル検索順位の操作--

ラプト理論は、陰謀論に興味がある人であれば、その名前を知らない人がいないほどの有名な内容です。

この有名なブログですが、最近のgoogleの検索アルゴリズムが変わったぐらいから、ラプトブログのトップページがgoogle検索で出てこなくなりました。

以前は、「rapt」、「ラプト理論」、「ラプトブログ」などで検索すれば、検索順位のトップに表示されていたのですが、今では、「rapt home」「rapt top」などで検索してもなかなかヒットしないように操作されています。

以下ツイートを参照すると、Bingの検索エンジンでは、トップに表示さているので、グーグルのアルゴリズムが悪いのか、意図的に操作しているのか、になると思います。いずれにせよ、検索者の検索意図を把握できない検索エンジンは、今後、衰退していくかもしれません。

なお、ラプト理論の検索以外でも、グーグルの検索操作されている事例は以下に掲載されています。


このように、ツイッター、YouTube、Googleによる言論弾圧が進んでいます。これに対抗するため、リツイートプログラムを作成しました。

・・・と、前置きが長くなりましたが、以下作成したプログラムです。



■条件付きリツイートプログラム

基本的には、以前作成したプログラムを修正したものとなっていますので、詳細は、以下を参照下さい。

--環境

 ・anaconda
 ・spyder 3.3.1
 ・python 3.7
 ・windows 10
 ・tweepy 3.8.0


--流れ

  1. インポート
  2.Tweppy-api認証
  3.タイムラインの取得
  4.メイン文
  5.条件付きリツイートの実施


----1.各種インポート

twitter apiを使うためのtweepy、dataframeを使うためpandasをインポート。

import tweepy
import pandas as pd
from datetime import timedelta,datetime


----2.Tweppy-api認証

#-Twitter APIを使用するためのConsumerキー、アクセストークン設定
def getApiInstance():
  Consumer_key =    ***取得したキーを入力***
  Consumer_secret = ***取得したキーを入力***
  Access_token =    ***取得したキーを入力***
  Access_secret =   ***取得したキーを入力***
  
  #-認証
  auth = tweepy.OAuthHandler(Consumer_key, Consumer_secret)
  auth.set_access_token(Access_token, Access_secret)
  api = tweepy.API(auth ,wait_on_rate_limit = True, wait_on_rate_limit_notify=True)

  return api

以前書いた以下の記事と同じなので、詳細はこちらを参照下さい。
https://note.com/believe2023/n/n7144b091d04c



----3.タイムラインの取得

#-timeline_info
def gettimeline_info(api, screen_name,df,columns):
   num=0 #-取得するツイートを計算する
   pages=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17] #-最大16回

   for page in pages:
       tweets=api.user_timeline(screen_name, count=200, page=page) #-1回200,pageはページの番号
       
       for t in tweets:
           t.created_at+=timedelta(hours=9) #-JSTに
           se = pd.Series([t.created_at, t.text, t.id, t.favorite_count], columns) #1行作成
           df = df.append(se, ignore_index=True) #-行方向に結合

           print('----------') #-見やすく
           print("num:",num,"page:",page)

           num+=1

   print(num, 'ツイート表示しました。')

   return df

(前記事の名残で、ゴミが残っていますが)

api.user_timelineで、指定ユーザのタイムラインを新しいほうから取得できます。できるだけ多く取得するため、count=200(最大取得数)とし、page=1~17(最大16回)でページ数分ループを回します。

また、

t.created_at:作成日時
t.text:ツイートテキスト
t.id:ツイートID
t.favorite_count:「いいね」の数

をそれぞれのツイートで取得し、forループ内で、dfに次々結合しています。

screen_nameには、リツイートしたいユーザのスクリーンネームをいれます。この関数の入力dfに各ツイートで抽出した内容が追記され、引数で渡しています。


----4.メイン文


if __name__ == "__main__":
   screen_name = input("RTしたい人のscreen_nameを入力")
   fnum = input("いいね数の下限を入力")
   kword = input("含むキーワードを入力、未入力の場合はすべてRT")
   api = getApiInstance()
   n=1
   
   columns = ["tweet_at","text","id","favorite_count"]
   df = pd.DataFrame(columns=columns)
   df = gettimeline_info(api, screen_name,df,columns)
   text=list(df.loc[:,["text"]]["text"]) #-text列だけ抜き出し、リストに
   tweet_id=list(df.loc[:,["id"]]["id"]) #-tweet id列だけ抜き出し、リストに
   f_count=list(df.loc[:,["favorite_count"]]["favorite_count"]) #-いいね数 の列だけ抜き出し、リストに
   texts=text 
   

input関数を使い、都度、リツイート条件を変えられるようにしています。

screen_name:RTしたい人のスクリーンネーム(@以降)
fnum :「いいね」数の下限。多くいいねがついたものだけ、リツイートできるようにします。
kword :テキストに含むキーワード。
   screen_name = input("RTしたい人のscreen_nameを入力")
   fnum = input("いいね数の下限を入力")
   kword = input("含むキーワードを入力、未入力の場合はすべてRT")

その後、api認証しています。

columnだけ指定し、空のDataFrameを作ります。

   columns = ["tweet_at","text","id","favorite_count"]
   df = pd.DataFrame(columns=columns)

3で説明したgettimeline_infoを呼び出し、タイムラインに表示されるすべてのツイートをデータフレームとして作成します。そのうち、テキスト列、ID列、いいね数列のみを個別に取り出して、リストを作っています。

   df = gettimeline_info(api, screen_name,df,columns)
   text=list(df.loc[:,["text"]]["text"]) #-text列だけ抜き出し、リストに
   tweet_id=list(df.loc[:,["id"]]["id"]) #-tweet id列だけ抜き出し、リストに
   f_count=list(df.loc[:,["favorite_count"]]["favorite_count"]) #-いいね数 の列だけ抜き出し、リストに
   texts=text 



----5.条件付きリツイートの実施

   n=0
   for (i,text) in enumerate(texts):
       print("NOW-->>{:03}".format(i))
       if type(text) is str:
           if not "@" in text[0:4]:#-RTおよびリプライは除外する
               if f_count[i] >= int(fnum):#-いいね数の下限指定
                   if kword in text: #-キーワード
                       print(text)
                       n +=1
                       
                       try:
                           #- リツイート実行
                           api.retweet(tweet_id[i])
                           #- いいね実行
                           api.create_favorite(tweet_id[i])
                       except:
                           print('error')
                       
           
       else:
           pass

   print(n, '件リツイートしました。')

タイムラインにあるツイートすべてを対象にし、forループで回します。

以下を入れて、リツイートや、リプライは除外しています。リツイートのテキストは「RT @」が、リプライは「@」が最初に記載されているからです。

if not "@" in text[0:4]:

リツイートの条件は、以下の文で指定しています。
「いいね」の下限以上で、かつ、キーワードを含むツイートのみを抽出しています。

if f_count[i] >= int(fnum):#-いいね数の下限指定
if kword in text: #-キーワード

最後に、抽出したツイートに対して、「リツイート」と「いいね」を実施し、完了です。
途中で止まらないよう、エラー処理(try,except)も入れています。

try:
    #- リツイート実行
    api.retweet(tweet_id[i])
    #- いいね実行
    api.create_favorite(tweet_id[i])


----完成したコード

import tweepy
import pandas as pd
from datetime import timedelta,datetime


def getApiInstance():
   #-Twitter APIを使用するためのConsumerキー、アクセストークン設定
   Consumer_key = '***'
   Consumer_secret = '***'
   Access_token = '***'
   Access_secret = '***'
   
   #-認証
   auth = tweepy.OAuthHandler(Consumer_key, Consumer_secret)
   auth.set_access_token(Access_token, Access_secret)
   api = tweepy.API(auth ,wait_on_rate_limit = True)

   return api


#-timeline_info
def gettimeline_info(api, screen_name,df,columns):
   num=0 #-取得するツイートを計算する
   pages=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17] 

   for page in pages:
       tweets=api.user_timeline(screen_name, count=200, page=page) 
       
       for t in tweets:
           t.created_at+=timedelta(hours=9) 
           se = pd.Series([t.created_at, t.text, t.id, t.favorite_count], columns) 
           df = df.append(se, ignore_index=True) #-行方向に結合

           print('----------') 
           print("num:",num,"page:",page)

           num+=1

   print(num, 'ツイート表示しました。')

   return df


if __name__ == "__main__":
   screen_name = input("RTしたい人のscreen_nameを入力") 
   fnum = input("いいね数の下限を入力")
   kword = input("含むキーワードを入力、未入力の場合はすべてRT")
   api = getApiInstance()
   n=1
   
   columns = ["tweet_at","text","id","favorite_count"]
   df = pd.DataFrame(columns=columns)
   df = gettimeline_info(api, screen_name,df,columns)
   text=list(df.loc[:,["text"]]["text"]) #-text列だけ抜き出し、リストに
   tweet_id=list(df.loc[:,["id"]]["id"]) #-tweet id列だけ抜き出し、リストに
   f_count=list(df.loc[:,["favorite_count"]]["favorite_count"]) #-いいね数 の列だけ抜き出し、リストに
   texts=text 
   
   n=0
   for (i,text) in enumerate(texts):
       print("NOW-->>{:03}".format(i))
       if type(text) is str:
           if not "@" in text[0:4]:#-RTおよびリプライは除外する
               if f_count[i] >= int(fnum):#-いいね数の下限指定
                   if kword in text: #-キーワード
                       print(text)
                       n +=1
                       
                       try:
                           #- リツイート実行
                           api.retweet(tweet_id[i])
                           #- いいね実行
                           api.create_favorite(tweet_id[i])
                       except:
                           print('error')
                       
           
       else:
           pass

   print(n, '件リツイートしました。')

inputを使いリツイート条件を変えられるので、使いやすい感じにできたと思います。条件分の書き方は、もっとスマートな書き方があるかなと思いました。



■おわりに -我々庶民ができること-


この日本は李家(上級国民)によって牛耳られています。コロナのウソや、言論弾圧に負けずに我々庶民ができることは何でしょうか?

1.真実を知ること
2.真実を拡散すること


李家や上級国民たちは、大きなウソならバレないと高をくくり我々を支配しようとしています。でも、ウソは必ずバレます。彼らは、今もウソがバレることに対し、不安でいっぱいなのだと思います。

そのようなウソに対し、我々が真実を知って、拡散することは彼らが最も恐れていることです。

まずは、真実を知ってみませんか?以下の動画を見ると頭がスッキリし、不安や心配なく生きられるようになります。

長文お読み頂き、ありがとうございました。^^


ーーーーーーーーーーーーーーーーーーーーーーーー

●コロナはウソ


●この世を支配する李家


●今後、どうしていけばいいか?


●ブログ