PRANK
Il fait un bot Twitter, ça tourne mal.
François Eoche
+
Web cabinetmaker
La présentation qui va suivre vous montrera bien des aspects de développement, mais ceux-ci ne seront finalement que du code un peu moisi. Ici, on parle majoritairement du principe de faire des bots sans grand intérêt pour Twitter.
Egalement, de l'humour (pas très bon) sera présent dans ces slides. Si vous n'êtes pas familier avec le concept, demandez conseil à votre pharmacien.
Bien qu'inspirée en partie de faits réels, les personnages et les situations de ce récit étant purement fictifs, toute ressemblance avec des personnes ou des situations existantes ou ayant existé ne saurait être que fortuite.
Lorem ipsum dolor sit amet, consectetur adipiscing elit e que s'apelerio Quézac.
Le jour où tout a commencé
In Peace
Ok, bah on y va?
const twitterAPI = new Twitter({
consumer_key,
consumer_secret,
access_token_key,
access_token_secret
});
KEYWORDS: [
/digita(l|ux)/gmi,
/#?transfo(rmation)?\s?digi(tal)?/gmi,
/campagnes?\s?digital/gmi,
/fractures?\sdigitale/gmi
],
EXCEPTIONS : [/(?:(?:dispositif|empreinte|affichage)s?\s|num[ée]rique.*?|num[ée]riser.*?|[_./#\-"]|@.*?|
\spas\s)([dD]igita(?:l(?:es)?|ux|lis(?:er|ations?)?))|([dD]igita(?:l(?:es)?|ux|lis(?:er|ations?)?))\s
(?:(?:dash|native|nomad|deluxe|transformation)|.*?numérique|.*?num[ée]riser)|Digital/]
// Digital, digital native, empreintes digitales, ... (et numérique, hein)
L'échec n'est pas une option
// Tweet contains text (how dumb)
tweet.text &&
// Tweet is in french (Twitter language detection)
tweet.lang === `fr` &&
// Tweet is in french for sure (external library detection)
lngDetector.detect(tweet.text) === `french` &&
// Tweet is not a Retweet
!containsRegExp(tweet.text, [/RT\s\@/]) &&
// Tweet has not been already answered
!recordedTweets.includes(tweet.text) &&
// Tweet does not contain any of the excluded terms
!containsRegExp(tweet.text, data.KEYWORDS)
===> TWEET !
P : probabilité de répondre au tweet
n : nombre de tweets de suite avec mot-clé
f : nombre de followers
Y'a plus qu'à appliquer !
+
Éviter les tweets dupliqués, ça se fait aussi avec :
"LEGO Star Wars - Millenium Falcon" VS "Lego faucon millenium Star Wars" = 0.710 // 71%
"Lego faucon millenium Star Wars" VS "LEGO Star Wars - Millenium Falcon" = 0.667 // 66.7%
"Toto va à la mer Star wars" VS "Lego faucon millenium Star Wars" = 0.654 // 65.4%
🅰️ Micro casque Xbox One à 20€ au lieu de 49€ ! dlbs.fr/cxb69 #bonplan
🅱️ Casque Xbox One à 20e chez leclerc hmstr.biz/TO5Qe (passe à ce prix dans le panier)
🅰️ micro casque xbox one 20€ au lieu de 49€
🅱️ casque xbox one 20€ chez leclerc passe ce prix dans le panier
simplifyAndComparePrices()
🅰️ ["casque", "micro", "lieu", "xbox", "one", "20€", "au", "de", "49€"]
4 mots en commun avec 🅱️ sur 9 mots = 44% de ressemblance
🅱️ ["leclerc", "casque", "panier", "passe", "chez", "dans", "prix", "xbox", "one", "20€", "ce", "le"]
4 mots en commun avec 🅰️ sur 12 mots = 33% de ressemblance
🅰️ micro casque xbox one 20€ au lieu de 49€
🅱️ casque xbox one 20€ chez leclerc passe ce prix dans le panier
splitOrderAndCompare()
Doublon !
0.623, donc 62.3% de similitude
🅰️ micro casque xbox one 20€ au lieu de 49€
🅱️ casque xbox one 20€ chez leclerc passe ce prix dans le panier
damerau_levenshtein(🅰️,🅱️)
Ça marche, mais ça n'est pas parfait (beaucoup de "coup de bol" au niveaux des doublons, quelques faux-positifs)
Améliorations :
"Elle semble se nourrir essentiellement de plancton, et de hotdog."
=> [{"elle":["PRO:per"]},{"semble":["VER"]},{"se":["PRO:per"]},{"nourrir":["VER"]},{"essentiellement":["ADV"]},
{"de":["PRE","NOM","ART:def"]},{"plancton":["NOM"]},{"et":["CON"]},{"de":["PRE","NOM","ART:def"]},
{"hotdog":["UNK"]}]
Ok, mais l'hébergement d'un bot?
npm start
J'ai retenu ces options (gratos) :