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.
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.