Twitter - robotlarımızın birbirleriyle iletişim kurduğu yer

Tam metin 4713 Kelimeler, tahmini öğrenme süresi 9 dakika

Resim Jonny Lindner, tarafından Pixabay'a yüklendi

Tartışmalı bir deney yapmak üzere bir Twitter botu oluşturmak için Python'u nasıl kullanacağınızı görmek için bu makaleyi okuyun. Bu makale tüm kodu ve ayrıntılı talimatları içermektedir.

Özet

Bu makale, hayran yaratmak için bazı temel insan duygularını kullanan bir Twitter sohbet botunu nasıl oluşturduğumu ayrıntılı olarak açıklayacak. Bu tür şeyler çevremizde her gün olur. Bence önemli olan herkesin bunun kolay olduğunu bilmesini sağlamak. Bazı ilginç deneyimleri paylaşacağım ve size Twitter'da bot ekleme örnekleri göstereceğim.

Robotun kodu ve işlevi bu makalenin ikinci yarısında ayrıntılı olarak açıklanmıştır. Mevcut ürün kodu Github'da mevcuttur. Robotu AWS'de çalıştırıyorum ve sunucusuz mimari aracılığıyla dağıtıyorum, bu da aylık ücretsiz AWS katmanının% 5'ini bile kullanmıyor. Bu yüzden denemeye değer.

motivasyon

Unsplash'tan Patrick Fore tarafından çekilen resim

İnsanların Python kullanmayı öğrenmelerine yardımcı olacak bazı makaleler yazmak istiyorum, bu da becerilerini genişletmeye yardımcı olabilir. Nedenin bir kısmı, bazı ekip üyelerinin Python öğrenmek istemesidir. Başlangıçta, nasıl sonuçlandığını görmek için kendime yaklaşık iki ay yapmamı söyledim. Kesinlikle gerekliyse, size Python'u nasıl kullanacağınızı öğretmek için net bir yapıya ve net bir içeriğe sahip bazı makaleler bulacağım. Herkesin biraz Python öğrenebileceğine inanıyorum.

Twitter

Nicholas Green tarafından çekilen görüntü

Tweepy

Resim, Safar Safarov tarafından Unsplas'tan alınmıştır.

Tweepy, Twitter API'sine erişebilen bir Python kitaplığıdır. Tweepy'deki dokümantasyon düzgün görünüyor ve kod iyi korunuyor. Bunu denemek istiyorum

sertifika

Kimlik doğrulamasını ayarlamak ve kimlik bilgilerini almak düşünüldüğünden daha kolaydır:

1. Twitter'ın geliştirici sayfasına gidin

2. Twitter hesabına giriş yapın

3. Bir uygulama oluşturun ve kimlik bilgilerini alın (Anahtarlar ve Belirteçler altında kırmızı daireye bakın)

Twitter uygulaması oluşturma adımları

Robotun yapısı

Jupyter Notebook'taki kimlik bilgilerini basit bir API çağrısıyla test ettim ve her şey yolunda görünüyor. Şimdi bir sonraki adıma başlama zamanı. Twitter botum iki şey yapmalı:

Hayranlar oluşturun

· Medium'u tanıtan makaleler

Hayranlar oluşturun

Birkaç yıl önce Instagram robotuyla bir deney yaptım ve ilk hedefe nasıl ulaşacağımı biliyordum. Bu ahlaka aykırıdır çünkü sevilmek ve tanınmak için insan arzusundan yararlanır ve yarattığı her şey sahtedir. Ama yine, bu Twitter. Ayrıca belirli yöntemlerden bahsetmenin gerekli olduğunu düşünüyorum. Herkese bu robotların nasıl çalıştığını ve ne kadar etkili olduklarını göstermek çok önemli. Ayrıca bu robotların her gün yaygın olarak kullanıldığını herkese göstermek gerekiyor.

Robotun çalışma şekli, insanlara farkındalık ve dikkat vermektir:

1. Kullanıcılarla etkileşime geçin (yeniden yayınlamak, tweet'lerine yorum yapmak ve onları takip etmek gibi)

2. Bekleyin ve izleyin

3. Size dönüşlerini izleyin

4. Bir süre bekleyin, ardından çıkarın

Bu nedenle, şimdilik tüm etik konuları bir kenara bırakırsak, aşağıdaki ilgili koddur.

Kullanıcılarla etkileşim

Projelerde, genellikle konfigürasyon modüllerini konfigürasyon ayarları için bir soyutlama katmanı olarak kullanırım.

işletim sistemini içe aktar

yaml'yi _yaml olarak içe aktar

içe aktarma günlük kaydı

logger = logging.getLogger ()

logger.setLevel (logging.INFO)

defget_config ():

config_path = os.path.join (os.path.dirname (__ dosya __), '..', 'config', 'production.yml')

Deneyin:

config_file olarak açık (config_path):

return _yaml.load (config_file)

excluFileNotFoundError:

logger.error (f '{config_path}' i bulamadığımız için muhtemelen bir production.yml oluşturmayı unuttunuz)

yükseltmek

defget_post_data ():

data_path = os.path.join (os.path.dirname (__ dosya __), '..', 'config', 'post_data.yml')

config_file olarak açık (veri_yolu):

return _yaml.load (config_file)

twitter_config.py GitHub tarafından barındırılmaktadır

bots.config

Yapılandırma aşağıdaki gibidir:

# Ayrıca Yazma Erişimi

API_KEY: "API ANAHTARINIZ BURADA"

API_KEY_SECRET: "API GİZLİĞİNİZ BURADA"

ACCESS_TOKEN: "BURADAN ERİŞİM TOKENİZ"

ACCESS_TOKEN_SECRET: "ERİŞİM TOKENİZ BURADA GİZLİ"

twitter_sample_config.yml, GitHub tarafından barındırılıyor

production.yml

Ardından, Twitter API'sini sağlamak için aşağıdaki gibi bir modül kurabilirsiniz:

ithal tweepy

bots.config'den get_config içe aktarın

__API = Yok

defconfigure_twitter_api ():

API_KEY = get_config ()

API_KEY_SECRET = get_config ()

ACCESS_TOKEN = get_config ()

ACCESS_TOKEN_SECRET = get_config ()

auth = tweepy.OAuthHandler (API_KEY, API_KEY_SECRET)

auth.set_access_token (ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

api = tweepy.API (auth, wait_on_rate_limit = True, wait_on_rate_limit_notify = True)

dönüş api

defget_twitter_api ():

global__API

ifnot__API:

__API = configure_twitter_api ()

return__API

twitter_api.py , GitHub tarafından barındırılıyor

botlar.twitter_api

Aşağıdaki kod, etkileşim mantığını içerir.

ithal tweepy

bot.twitter_api içeriğinden get_twitter_api

bot.utils'i _utils olarak içe aktar

tarih saatini içe aktar

içe aktarma günlük kaydı

rastgele içe aktar

ithalat zamanı

logger = logging.getLogger ()

logger.setLevel (logging.INFO)

YORUMLAR =

HASHTAG_SETS =

deffetch_most_original_tweets (kullanıcı):

sonuçlar =

get_twitter_api (). user_timeline (user.id, count = 20) içindeki tweet için:

ifnot (tweet.retweeted veya tweet.in_reply_to_status_id):

tweet.score = score_tweet (tweet)

results.append (tweet)

sonuçları döndür

definteract_with_user (kullanıcı, following_history, hashtag'ler):

ifnot user.following:

logger.info (f "{user.name} izleniyor")

user.follow ()

following_history = {'follow_at': datetime.datetime.now (). isoformat ()}

user_tweets = sıralı (fetch_most_original_tweets (kullanıcı), anahtar = lambda x: x.score, ters = Doğru)

iflen (user_tweets) > 0:

etkileşimler = 0

user_tweets içindeki tweet için:

etiketler = {tweet.entities.get'teki etiket için tag.lower () ('hashtag'ler')}

lower_given_tag = {hashtag'lerdeki etiket için tag.lower ()}

lower_given_tag içindeki given_tag için:

tweet.text.lower () içinde given_tag ise:

found_tag_in_text = Doğru

kırmak

Başka:

found_tag_in_text = Yanlış

if (len (etiketler ve lower_given_tag) > 0) veya found_tag_in_text:

etkileşim = 0

random.random () ise > 0.95:

yorum = f '@ {kullanıcı.screen_name} {random.choice (YORUMLAR)}'

logger.info (f "Yorum yapma: {tweet.id} ile: {comment}")

get_twitter_api (). update_status (

yorum Yap,

in_reply_to_status_id = tweet.id_str,

auto_populate_reply_metadata = Doğru

)

time.sleep (random.random () / 2)

etkileşim | = 1

ifnot tweet.favorited ve (random.random () > .5) ve tweet.lang == 'en':

logger.info (f "Kalp atma: {tweet.id} ile metin: {tweet.text}")

get_twitter_api (). create_favorite (tweet.id)

time.sleep (random.random () * 5)

etkileşim | = 1

random.random () ise > 0.95:

logger.info (f "Retweetleme: {tweet.id}")

logger.info (f "Metin: {tweet.text}")

get_twitter_api (). retweet (tweet.id)

time.sleep (random.random ())

etkileşim | = 1

etkileşimler + = etkileşim

etkileşimler == 2 ise:

kırmak

defscore_tweet (tweet):

sık kullanılanlar = _utils.scaled_sigmoid (x = -tweet.favorite_count, stretch = 2, max_score = 50, center = 3)

retweets = _utils.scaled_sigmoid (x = -tweet.retweet_count, stretch = 1, max_score = 50, center = 2)

age = _utils.created_at_score (tweet, stretch = 2, max_score = 30, center = 3)

skor = favoriler + retweetler + yaş

dönüş puanı

defscore_user (kullanıcı):

follow_to_following = _utils.followed_to_following_ratio (kullanıcı)

follower = _utils.scaled_sigmoid (x = -user.followers_count, stretch = 200, max_score = 100, center = 300)

age = _utils.created_at_score (user, stretch = 50, max_score = 30, center = 60)

skor = follow_to_following + takipçi + yaş

dönüş puanı

defget_users_from_recent_tweets (cnt = 10, hashtags = Yok):

q = 'VE'.join ()

kullanıcılar =

tweepy.Cursor'da tweet için (get_twitter_api (). search, q = q, lang = "tr", count = cnt, result_type = 'Recent'). öğeler (cnt):

users.append (tweet.user)

geri dönen kullanıcılar

deffetchfollow (etkinlik = Yok, bağlam = Yok):

hashtags = random.choice (HASHTAG_SETS)

# monkey-tweepy User sınıfını hızlı bir şekilde benzersiz kullanıcılar edinmemiz için ihtiyaç duyacağımız bir hashfunction ekleyerek yama

tweepy.models.User .__ hash __ = lambda self: hash (self.id_str)

kullanıcılar = liste (set (get_users_from_recent_tweets (cnt = 250, hashtags = hashtags)))

# puan kullanıcı

kullanıcılardaki kullanıcılar için:

user.score = score_user (kullanıcı)

# kullanıcıları puana göre sırala

kullanıcılar = sıralanmış (kullanıcılar, anahtar = lambda x: x.score, ters = Doğru)

logger.info (f "Bulunan {len (kullanıcılar)}")

following_history = _utils.get_s3_data ('following.json')

max_interactions = 10

etkileşimler = 0

kullanıcılardaki kullanıcılar için:

time.sleep (random.random () * 10 + 2)

user.id_str aşağıdaki_ geçmişte değilse:

Deneyin:

logger.info (f "{user.name} ile etkileşim")

Interactive_with_user (kullanıcı, aşağıdaki_history, hashtag'ler)

etkileşimler + = 1

e hariç istisna:

logger.error (f 'Hata durumunda takipçi geçmişini senkronize etme: {e}')

_utils.sync_s3_data (following_history)

yükseltmek

eğer etkileşimler > = max_interactions:

kırmak

logger.info ('Takipçi geçmişini sıradan sonlandırmada senkronize etme')

_utils.sync_s3_data (following_history)

defcomment_tweet (kullanıcı, tweet):

yorum = f '@ {kullanıcı.screen_name} {random.choice (YORUMLAR)}'

logger.info (f "Yorum yapma: {tweet.id} ile: {comment}")

get_twitter_api (). update_status (

yorum Yap,

in_reply_to_status_id = tweet.id_str,

auto_populate_reply_metadata = Doğru

)

if__name __ == '__ main__':

fetchfollow ()

GitHub tarafından barındırılan fetchfollow.py

bot.fetchfollow

İki değişkenle başlayın: COMMENTS ve HASHTAG_SETS, bu iki değişkene daha sonra atıfta bulunulacaktır, içerik ve ad verildiği sürece, kullanımları açıktır. YORUMLAR listesi bir dizi genel olumlu yorumu depolar ve HASHTAG_SETS, arama için bir dizi farklı etiket kombinasyonunu depolar.

Ana işlev, aşağıdaki işlemleri gerçekleştiren fetchfollow işlevidir:

· Twitter'ı aramak için HASHTAG_SETS'te rastgele etiketler kullanın.

· Bu Twitter kullanıcılarını bulun. Bu kullanıcıların hayranlarının sayısına (ne kadar azsa o kadar iyi), hayran takip oranına (ne kadar düşükse o kadar iyi) ve hesabın kullanıldığı süreye (ne kadar yeni olursa o kadar iyi) göre kullanıcılar puanlanır ve en yüksek puana göre sıralanır (ör. Size geri dönme olasılığı en yüksek olan kullanıcı) ilk, en düşük puana sahip olan ise sonuncudur.

· S3'ten aşağıdaki_history'yi edinin. Bu dosya, her bir kullanıcının izlendiği tarihi (ve daha sonra serbest bırakıldıkları tarihi) içerir.

· En yüksek puandan en düşük puana kadar aşağıdaki_history'de olmayan kullanıcılarla etkileşim kurun (sonuçta her kişi 10 defaya kadar, bir robot uyarısını tetiklemek istemiyoruz). Etkileşimde bulunurken, etiketlerimizi içeren tweet'leri derecelendirin, ardından bu tweet'leri rastgele beğenin, yorumlayın ve yeniden yayınlayın.

· Aşağıdaki_history'ye kullanıcıları ekleyin ve S3'e güncelleyin. Sonuçta, artık onlara dikkat etmek istemiyoruz.

Bekleyin ve gözlemleyin

Bu aşama çok ilginç. Bu aşama, robotun twitter'a dağıtıldığı ve sonuçların gözlemlendiği aşamadır. Bazen ilginç bulacaksın, bazen kafan biraz karışacak. Instagram'da botları denediğimde, Instagram'da çok fazla pornografi olduğunu çabucak keşfettim. Ama bu daha sonraki bir şey.

Twitter botunun ilk sürümünü oluşturduktan sonra üç şey öğrendim:

Tweet aramanın yolu ayarlanmalıdır, çünkü başlangıçta yalnızca Python'da arama yapılır.

Robot çalışma sıklığı, davranış kesinliğini azaltmak için ayarlanmalıdır.

Robotun ilk versiyonu, tıpkı bir enerji içeceği içtikten sonra "Buz Devri" ndeki sincap gibi, başkalarının tweet'lerini çılgınca yorumladığım ve beğendiğim için çabucak engellendi.

Çok fazla yorum yapıldıktan sonra ilk uygulama kısıtlandı

Ancak bu sefer yeni bir uygulama oluşturmak ve daha temkinli bir yaklaşım benimsemek oldukça kolaydı.

Twitter'da çok sayıda robot var. Aldığım yanıt, "Hey, benimle ilgilendiğin için teşekkür ederim. Lütfen sık kullandığım bu güzel hizmete bir göz at: https: //xxxbots.xx" oldu. Onları tebrikler, çok akıllılar ve viral bir pazarlama yöntemini benimsiyorlar.

Robotlar robotuma yanıt verdi ve mesaj listesi artmaya devam ediyor

Sana dönmelerini izle

Geçtiğimiz dört hafta içinde Twitter hesabım yaklaşık 600 takipçi biriktirdi ve ara sıra Medium gönderileri listesine yeni bir giriş eklemenin dışında hiçbir şey yapmadım.

Bir süre bekleyin, sonra çıkarın

Çok fazla insana dikkat etmek istemediğiniz için, dengeyi korumak için zaman zaman bazı insanları kontrol etmelisiniz.

bot.utils'i _utils olarak içe aktar

dateutil.parser içe aktarma ayrıştırmasından itibaren

bot.twitter_api içeriğinden get_twitter_api

rastgele içe aktar

içe aktarma günlük kaydı

ithalat zamanı

tarih saatini içe aktar

logger = logging.getLogger ()

logger.setLevel (logging.INFO)

defunfollow (olay = Yok, bağlam = Yok):

random.random () ise > .yirmi üç:

logger.info (f'Bu sefer hiçbir şey yapmıyorum ')

Başka:

following_history = _utils.get_s3_data ('following.json')

sıralanmış_by_following_date = sıralı (

,

anahtar = lambda x: ayrıştırma (x)

)

number_to_unfollow = random.randint (1, 3)

sıralı_takip_takip_tarihinde şu anda takip etmek için:

_id = şu anda_following

Deneyin:

baskı (_id)

get_twitter_api (). destroy_friendship (_id)

following_history = tarihsaat.datetime.now (). isoformat ()

logger.info (f'Unfollowing: {_id} ')

e hariç istisna:

logger.error (f'Unfollowing: {_id}, {e} 'hatasıyla çalışmadı)

time.sleep (random.randint (2, 8))

_utils.sync_s3_data (following_history)

twitter_unfollow.py GitHub tarafından barındırılıyor

botlar.unfollow

Kontrol işlevi yürütüldüğünde, önce önceden yüklenmiş olan following_history'yi alır ve sonra kontrol etmemiş olan tüm kullanıcıları dikkat tarihine göre artan sırada sıralar. İlk üç kullanıcı için, destroy_friendship (kaldırma işlevi) çağırın. Bu ismi kendim seçtim. Ardından, işlev aşağıdaki_ geçmişi güncelleyecek ve yeniden çağrılmaya hazır olacaktır.

Medium makalelerini tanıtın

Bu kısım basittir, elbette etiğin sorgulanmasına gerek yoktur.

koleksiyonlardan adlandırılmış çift içe aktar

bot.twitter_api içeriğinden get_twitter_api

rastgele içe aktar

içe aktarma günlük kaydı

bot.config'den get_post_data içe aktarın

logger = logging.getLogger ()

logger.setLevel (logging.INFO)

classMediumPost (namedtuple ('MediumPost',)):

defmake_post (self):

used_tags = self.tags

returnf '{self.text} {"" .join ()} {self.url}'

defpost_to_twitter (kendi):

api = get_twitter_api ()

res = api.update_status (self.make_post ())

dönüş res

defpost_random_medium_article (olay = Yok, bağlam = Yok):

gönderi =

random_post = random.choice (gönderiler)

logger.info (f'Posting: {random_post} ')

random_post.post_to_twitter ()

if__name __ == '__ main__':

#posts =

#print (gönderi)

post_random_medium_article ()

twitter_post.py GitHub tarafından barındırılıyor

bots.post

Bu komut dosyası, referans listesinden rastgele bir makale yayınlar. Referans listesi aşağıdaki gibidir:

Gelişmiş-Görselleştirme Satış Ekibi:

-Advanced-Visualize Satış Ekibi

-https: //towardsdatascience.com/how-to-explore-and-visualize-a-dataset-with-python-7da5024900ef

- Veri bilimi

-Büyük veri

-Veri goruntuleme

-Bir veri seti nasıl görselleştirilir!

....

Gelişmiş-Kedi, Köpek veya Elon Musk:

-Advanced-Cat, Dog veya Elon Musk

-https: //towardsdatascience.com/cat-dog-or-elon-musk-145658489730

- Veri bilimi

-Büyük veri

-Veri analizi

-Python

-Otomasyon

-Makine öğrenme

-Botlar

-Python ve Keras ile 15 dakikadan daha kısa bir sürede görüntü tanıyan evrişimli bir sinir ağını nasıl oluşturacağınızı öğrenin!

GitHub tarafından ile barındırılan post_data.yml

Tweet örneği

dağıtmak

Unsplash.com'dan elCarito tarafından çekilen resim

Robotu AWS'ye dağıtmak için Lambda işlevlerini ve önceden tanımlanmış bir programı (serverless.yml içinde belirtilir) kullanarak Sunucusuz bir mimari kullandım.

hizmet: fb-TwitterBot

Sağlayıcı:

isim: aws

çalışma zamanı: python3.6

bellek boyutu: 256

zaman aşımı: 900

bölge: $ {opt: region, 'eu-central-1'}

stage: $ {opt: stage, 'production'}

çevre:

PROJE: $ {self: service} - $ {self: provider.stage}

ENV: $ {self: provider.stage}

iamRoleStatements:

-Etki: "İzin Ver"

Aksiyon:

- "s3: *"

Kaynak: 'arn: aws: s3 ::: fb-twitterbot'

-Etki: "İzin Ver"

Aksiyon:

- "s3: *"

Kaynak: 'arn: aws: s3 ::: fb-twitterbot / *'

özel:

pythonRequirements:

dockerizePip: linux olmayan

eklentiler:

-serverless-python-gereksinimleri

fonksiyonlar:

Çalıştırmak:

işleyici: botlar / fetchfollow.fetchfollow

Etkinlikler:

-chedule:

oran: cron (15 * / 3 * *? *)

İleti:

işleyici: botlar / post.post_random_medium_article

Etkinlikler:

-chedule:

oran: cron (377,18 * *? *)

takibi bırak:

işleyici: botlar / takibi bırak.unfollow

Etkinlikler:

-chedule:

oran: cron (17,32,45 * / 2 * *? *)

by GitHub tarafından barındırılan serverless.yml

serverless.yml

Robotu kurmak oldukça basit, ancak Sunucusuz'u açıklamak için başka bir makale yazacağım. Robotu güncellemek istiyorsanız, komut dosyasında bazı değişiklikler yapmanız ve ardından sunucusuz dağıtımı çalıştırmanız gerekir.

Sonuç

Bu makaleyi okurken herkesin gerçek zamanlı bir referansı olması için robotun daha uzun süre çalışmasını sağlayacağım. Ancak, eninde sonunda kapatacağım.

Önerilen okuma konuları

Yorum Beğen Takip Et

AI öğrenme ve geliştirmenin kuru mallarını paylaşalım

Yeniden yazdırmanız gerekirse, lütfen arka planda bir mesaj bırakın ve yeniden yazdırma şartnamelerine uyun.

Özellikle tavsiye edilir! Sizi sorunlardan uzak tutmak için Python geliştirme ortamını optimize etmeye yönelik birkaç ipucu
önceki
düşürmek! Size özel Kafka eğitiminiz burada, lütfen almaya dikkat edin
Sonraki
Changping metro hattının güney uzantısı tamamen başlatıldı ve Pekin kuzey-güney Shinkansen'i ekleyecek
Bugünün temel sesi Uçaklara veya gece kulüplerine izin verilmez! Wang Sicong yüksek tüketimle sınırlandırıldı
Hisse senetlerinde iyi olan insanlar ne kadar korkunç: boğaları ve ayıları geçmek için 20 hareketli ortalamaya güvenmek, döngü boğalarını bulmak için bir numara, toplamaya değer
"Avrupa kanı Çin asla yetişemeyecek" mi? Az önce, @Çin Bilimler Akademisi Otomasyon Enstitüsü bir bildiri yayınladı, reddedildi
"Zombiler" tarafından yenilmeyin! Kubernetes (K8s) ile düşünmeyi öğrenin
Ağır hacim "yemek çubukları hattını" kırıyor: Ana gücün nihai birikimi tamamladığını kanıtlıyor. Elinizde 50.000 küçük fon varsa, tahtanın üst limitini bekleyebilirsiniz.
Şiddetle tavsiye edilir! Her zaman, her yerde mutlu olabilmeniz için kod kalitesini artırmanın 6 yolu
Alım satım hacmi, borsada insanları yanıltmayacak tek göstergedir. "Gök, göz ve yer hacmi" modeliyle karşılaştığında, yüksek satış ve düşük alım sorun değildir.
"Onlar aynı kişi mi?" Kocası hastalıktan öldü "daha çok" bir eş doğdu ve taşınmaz da bölündü
Biz ve "gerçek" yapay zeka: ulaşılabilir veya bir asır uzakta
Bir "bisküvi satma" öyküsü, borsanın özünü anlatır: tüm hissedarlar kilitlenene kadar hisse senetleri neden düştü? Hisse senetlerinin on yıl sapacağını anlayın
İngiltere'de bir villada 320 priz var ve her birinde en az 40 priz var Netizen: Daha önce CIA miydi?
To Top