0

このスクリプトは、costum の twitter URL 短縮機能には完全に機能していましたが、何らかの理由で壊れたリンクを配置し始めました。そして今では、以前は良かったものも含めてすべてのリンクが壊れています。twitter domain.com/p(somenumber) に表示されており、投稿にリダイレクトする代わりにその URL をブラウザーで開いています。問題は、Twitter で wordpress の投稿を自動投稿しているこの Perl コードにあると思います。

#!/usr/bin/perl -s

use strict;

use Data::Dumper;
use XML::Simple;

use Net::Twitter;
use Scalar::Util 'blessed';
use WWW::Facebook::API;
use JSON::Any;

use lib '/var/www/perl/.';

use MyLib::DB;
use MyLib::Settings;

my $settings = new Settings();
my $config = $settings->getConfig();

my $db = new DB(
                    dsn         =>$config->{sql_connection}->{dsn},
                    database    =>$config->{sql_connection}->{database},
                    server      =>$config->{sql_connection}->{server},
                    login       =>$config->{sql_connection}->{login},
                    password    =>$config->{sql_connection}->{password}
);

my %posts = $db->getList('select * from add_ready_post where wp_id > ( select max(wp_id) from add_ready_post where is_sent=1 ) and post_title <> "" limit 1;');

my $nt = Net::Twitter->new(legacy => 0);
my $nt = Net::Twitter->new(
    traits   => [qw/OAuth API::REST/],
    consumer_key        => '',
    consumer_secret     => '',
    access_token        => '',
    access_token_secret => '',
);

map {
    my $message = $posts{$_}[4];
    my $id = $posts{$_}[0];
    my $url = ' domain.com/p' . $posts{$_}[1];
    if ( $message ne '' )
    {
#       print 'Original: ' . $message . "\n";
        if ( length( $message ) < 110 )
        {
            $message = $message . ".";
        }
        if ( length( $message ) > 110 )
        {
            $message = substr( $message, 0, 110 );
            $message =~ /.*(\s\w+)$/i;
            my $newMessage = substr( $message, 0, index( $message, $1 ) );
            $message = $newMessage . '...';
        }

#       print 'Result  : ' . $message . $url . "\n";

        my $result = $nt->update( $message . $url );
#       print Dumper( $result );

#       print "\n";

        my $sql = "UPDATE add_ready_post SET is_sent=1 WHERE id=" . int( $id ) . ";";
        $db->execute( $sql );

    }
} keys %posts;
4

1 に答える 1

2

あなたはおそらく「本当の質問ではない」で締めくくられるでしょう - とにかく - いくつかのコメント:

何を「実行」しているのかわからないため、ハッシュMyLib::DB;が含まれているものを知らずにコードを分析することはできません。%posts

使用use warnings;- たとえば、$nt redefinedメッセージが表示されます...

 my $nt = Net::Twitter->new(legacy => 0);
 my $nt = Net::Twitter->new(

この方法で使用map {することは、ベスト プラクティスではありません。を使用すると非常に読みやすくなります

foreach my $post (keys %posts) {
}

メッセージがここで一致しない場合、何が得られますか? インデックスが -1 を返す場合はどうなるでしょうか。

$message =~ /.*(\s\w+)$/i;
my $newMessage = substr( $message, 0, index( $message, $1 ) );

そして、メッセージにスペースのみが含まれるのはいつですか? について考える:

if ( $message ne '' )

そして、ここにはもっと多くのことがあります...私はあなたがperlを学んでいるよりも理解していますが、問題を扱いやすい部分に分解して、本当の質問をしてみてください.

于 2013-04-04T20:58:50.600 に答える