I couldn't leave it there.I need a Twitter that sends all my grumpy thoughts into oblivion rather than to actual people.— Phil Sands (@PurdueCSPhil) July 10, 2017
I can write a tool that goes through all old tweets and deletes ones that don't pass criteria, but I prefer to get out ahead of the issue and leave the record as it is.You could do sentiment analysis as an alternate client or regularly after-the-fact to cut down on that. We have the technology.— Code By Java (@JacobyDave) July 10, 2017
And, as a later pass, one can pull a corpus, use a module like
Algorithm::NaiveBayes
and make your own classifier, rather than using Microsoft Research's Text Analytics API or another service. I was somewhere along that process when the hosting died, so I'm not bringing it here.I was kinda under the thrall of Building Maintainable Software, or at least the first few chapters of it, so I did a few things differently in order to get their functions less than 15 lines, but the
send_tweet
function didn't get the passes it'd need, and I could probably give check_status
some love, or perhaps even roll it into something like WebService::Microsoft::TextAnalytics
. In the mean time, this should allow you to always tweet on the bright side of life.#!/usr/bin/env perl use feature qw{ postderef say signatures } ; use strict ; use warnings ; use utf8 ; no warnings qw{ experimental::postderef experimental::signatures } ; use Carp ; use Getopt::Long ; use IO::Interactive qw{ interactive } ; use JSON ; use LWP::UserAgent ; use Net::Twitter ; use YAML qw{ LoadFile } ; my $options = options() ; my $config = config() ; if ( check_status( $options->{ status }, $config ) >= 0.5 ) { send_tweet( $options, $config ) ; } else { say qq{Blocked due to negative vibes, man.} } exit ; sub send_tweet ( $options, $config ) { my $twit = Net::Twitter->new( traits => [ qw/API::RESTv1_1/ ], consumer_key => $config->{ twitter }{ consumer_key }, consumer_secret => $config->{ twitter }{ consumer_secret }, ssl => 1, ) ; my $tokens = $config->{ twitter }{ tokens }{ $options->{ username } } ; if ( $tokens->{ access_token } && $tokens->{ access_token_secret } ) { $twit->access_token( $tokens->{ access_token } ) ; $twit->access_token_secret( $tokens->{ access_token_secret } ) ; } if ( $twit->authorized ) { if ( $twit->update( $options->{ status } ) ) { say { interactive } $options->{ status } ; } else { say { interactive } 'FAILED TO TWEET' ; } } else { croak( "Not Authorized" ) ; } } sub check_status ( $status, $config ) { my $j = JSON->new->canonical->pretty ; my $key = $config->{ microsoft }{ text_analytics }{ key } ; my $id = 'tweet_' . time ; my $object ; push @{ $object->{ documents } }, { language => 'EN', text => $status, id => $id, } ; my $json = $j->encode( $object ) ; my $api = 'https://westus.api.cognitive.microsoft.com/text/analytics/v2.0/sentiment' ; my $agent = LWP::UserAgent->new ; my $request = HTTP::Request->new( POST => $api ) ; $request->header( 'Ocp-Apim-Subscription-Key' => $key ) ; $request->content( $json ) ; my $response = $agent->request( $request ) ; if ( $response->is_success ) { my $out = decode_json $response->content ; my $doc = $out->{ documents }[ 0 ] ; return $doc->{ score } ; } else { croak( $response->status_line ) ; } return 1 ; } sub config () { my $config ; $config->{ twitter } = LoadFile( join '/', $ENV{ HOME }, '.twitter.cnf' ) ; $config->{ microsoft } = LoadFile( join '/', $ENV{ HOME }, '.microsoft.yml' ) ; return $config ; } sub options () { my $options ; GetOptions( 'help' => \$options->{ help }, 'username=s' => \$options->{ username }, 'status=s' => \$options->{ status }, ) ; show_usage( $options ) ; return $options ; } sub show_usage ($options) { if ( $options->{ help } || !$options->{ username } || !$options->{ status } ) { say { interactive } <<'HELP'; Only Positive Tweets -- Does text analysis of content before tweeting -u user Twitter screen name (required) -s status Status to be tweeted (required) -h help This screen HELP exit ; } } __DATA__ .microsoft.yml looks like this --- text_analytics: key: GENERATED_BY_MICROSOFT .twitter.cnf looks like this --- consumer_key: GO_TO_DEV.TWITTER.COM consumer_secret: GO_TO_DEV.TWITTER.COM tokens: your_username: access_token: TIED_TO_YOU_AS_USER_NOT_DEV access_token_secret:TIED_TO_YOU_AS_USER_NOT_DEV I cover access_tokens in https://varlogrant.blogspot.com/2016/07/nettwitter-cookbook-how-to-tweet.html
No comments:
Post a Comment