Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Perl + twitter + русский язык, проблема с кодировкой 
:(
    Опции темы
materiya
Дата 9.6.2011, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.6.2011

Репутация: нет
Всего: нет



Доброго времени суток.
есть проблема:
мой скрипт ищет посты в твитере по ключевым словам и фолловит хозяина поста.


Код

2my $mt = Net::Twitter::Search->new;
my $r = $mt->search({q=>'football',since_id=>$conf[0],rpp=>100});


выше указанный код работает хорошо.
но если вместо football написать русское слово, то скрипт ничего не находит

скриншот http://i076.radikal.ru/1106/4f/110a5733b96c.jpg

Подскажите, пожалуйста, кто знает что ему нужно.
Спасибо
PM MAIL   Вверх
arto
Дата 9.6.2011, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



правильную кодировку
PM MAIL ICQ   Вверх
materiya
Дата 9.6.2011, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.6.2011

Репутация: нет
Всего: нет



Цитата(arto @ 9.6.2011,  12:08)
правильную кодировку

логично

Цитата

правильную кодировку


логично, а может подскажете каким образом? не особо дружу с перлом. скажем так, вообще не дружу, но требование усовершенствовать именно этот скрипт
PM MAIL   Вверх
arto
Дата 9.6.2011, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



в вашем коде не видно, в какой кодировке у вас текст.

# perl -MEncode=_utf8_on -MNet::Twitter:smile -le '$nt = new Net::Twitter:smile; binmode STDOUT, ":encoding(utf8)"; _utf8_on($ARGV[0]); $a = $nt->search({q => $ARGV[0]}); foreach my $st (@{ $a->{results} }) { print $st->{text} }' Футбол
Тюмень: хоккейные болельщики будут играть ...в футбол http://bit.ly/iV70sr
ФУТБОЛ. "Реал" предлагает за Агуэро 45 млн. и права на Диарра и Негредо http://bit.ly/jS7tuw
Наконец-то это ### закончилось. Теперь даже как-то скучно. Хотя... КОНЬЯК! ФУТБОЛ! ТЕЛОЧКИ! СВОБОДА! Чё еще надо?
Футбол - Чемпионат Англии - Маркус Ханеманн стал свободным агентом: Голкипер Вулверхэмптона американец Маркус ... http://bit.ly/iSzmGL
Футбол - Чемпионат Англии - Маркус Ханеманн стал свободным агентом  #followback
тренировка зашибись. зарубились в футбол и успели со всеми переругаться! было жарко!!!
Футбол без Аршавина. Сборная России наконец-то провела неплохой товарищеский матч http://bit.ly/mPjRMi
#футбол Ювентус намерен приобрести полузащитника Порту Фернандо: Ювентус намерен приобрести полузащитника ... http://bit.ly/jse6Qy
#sport1bg Финалът за Купата на България по футбол за жени ще се проведе на 15-ти юни: Финалният мач за Купата на... http://bit.ly/injy3d
Футбол - 11 воинов в поле: 
                        В Китае прошел необычный футбольный матч в формате 11 на 100. http://bit.ly/jdokUA
Футбол - 11 воинов в поле  #followback RT!!
Футбол - Чемпионат Испании - Кака: В Интер я не ухожу: 
                        Полузащитник мадридского Реала Кака развеял слу... http://bit.ly/lJdZe4
слушаю спортивный канал на Маяке))опять про наш футбол будут говорить)))скока можно)
ФУТБОЛ. Булат Чагаев хочет переименовать "Ксамакс" http://tinyurl.com/3ojgec6
ФУТБОЛ. Булат Чагаев хочет переименовать "Ксамакс" http://bit.ly/loIU8R #sport #news

PM MAIL ICQ   Вверх
materiya
Дата 9.6.2011, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.6.2011

Репутация: нет
Всего: нет



спасибо, сейчас попробую

только в Вашем сообщении смайлики вывелись)))
не могли бы Вы написать код без них?)

Это сообщение отредактировал(а) materiya - 9.6.2011, 12:41
PM MAIL   Вверх
arto
Дата 9.6.2011, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



это Net::Twitter::Search
PM MAIL ICQ   Вверх
materiya
Дата 9.6.2011, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.6.2011

Репутация: нет
Всего: нет



спасибо, принцип понял. только не понял в каком месте нужно указывать ключевое слово
на всякий случай, вот полный код скрипта:

Код

#!/usr/bin/perl -w
use Net::Twitter;
use Net::Twitter::Search;
use Scalar::Util 'blessed';
use Data::Dumper;
  my $twi = Net::Twitter->new(
      traits   => [qw/OAuth API::REST/],
      consumer_key        => '',
      consumer_secret     => '',
      access_token        => '',
      access_token_secret => '',
  );
my $path='C:/tbot/';
my @conf=();
open (S,$path.'t_conf.txt') || die 'cant open';
@conf=<S>;
chomp @conf;
close(S); 
$conf[0]=0 if ! $conf[0];
  my $mt = Net::Twitter::Search->new;
  
  my $r = $mt->search({q=>'dreamfoot OR "football manager" OR "soccer manager"',since_id=>$conf[0],rpp=>100});

  my %targets=();
  $targets{$_->{from_user_id}}=$_->{from_user} foreach @{$$r{results}};
  my $reqs=0; 
  if (scalar(keys %targets)){  
          my %sended=();          
          open (F,$path.'t_requested.txt');
          my @reqs=<F>;
          chomp @reqs;
          foreach (@reqs){$sended{$_}=''}
          close(F);          
          foreach (keys %targets) {
            if (! exists $sended{$_})    {
                                            #create friend;
                                            print "$_ $targets{$_}\n";
                                            eval {$twi->create_friend($targets{$_})};
                                            $reqs++;
                                            open (S,'>>'.$path.'t_requested.txt') || die 'cant open';
                                            print S $_."\n";
                                            close(S);
                                            if ($reqs>10000){$$r{max_id}=0;last;}    
                                        }
          } 
  }
open (S,'>'.$path.'t_conf.txt') || die 'cant open';
print S $$r{max_id}."\n";
close(S);   
# print Dumper $r;


Это сообщение отредактировал(а) materiya - 9.6.2011, 12:49
PM MAIL   Вверх
arto
Дата 9.6.2011, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



какое ключевое слово?
я в вашем твитере не разбираюсь.
PM MAIL ICQ   Вверх
materiya
Дата 9.6.2011, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.6.2011

Репутация: нет
Всего: нет



Цитата

какое ключевое слово?

ну вот в строке 

Код

my $r = $mt->search({q=>'dreamfoot OR "football manager" OR "soccer manager"',since_id=>$conf[0],rpp=>100});


dreamfoot, football manager и soccer manager - это ключевые слова.

а в Вашем коде 

Код

$a = $nt->search({q => $ARGV[0]}); 
foreach my $st (@{ $a->{results} }) 
{ print $st->{text} }'


я так понимаю ключевое слово это  $ARGV[0].
или вместо  $ARGV[0] нужно вписать слово?
PM MAIL   Вверх
arto
Дата 9.6.2011, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



$ARGV[0] -- параметр командной строки, у меня -- Футбол
PM MAIL ICQ   Вверх
FreeGanzter
Дата 9.6.2011, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 4.5.2011

Репутация: нет
Всего: нет



Кстати в perl +Padre есть функция вывода сообщения в какой кодировке выводить
Пробуй запустить скрипт не из командной строки а с IDE Padre и пробуй разные кодироки пока нибудет читаемым
PM MAIL   Вверх
materiya
Дата 9.6.2011, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.6.2011

Репутация: нет
Всего: нет



Цитата(arto @ 9.6.2011,  13:49)
$ARGV[0] -- параметр командной строки, у меня -- Футбол


у меня ошибка

в приложении сктриншот

Это сообщение отредактировал(а) materiya - 9.6.2011, 14:54

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  __________.JPG 23,65 Kb
PM MAIL   Вверх
alezzz
Дата 9.6.2011, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 1
Всего: 14



Windows понимает только двойные кавычки (во всяком случае у меня не получилось запускать командлайны с одинарными). Запускайте из файла или из редактора.
PM MAIL   Вверх
materiya
Дата 9.6.2011, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.6.2011

Репутация: нет
Всего: нет



Цитата(alezzz @ 9.6.2011,  15:35)
Windows понимает только двойные кавычки (во всяком случае у меня не получилось запускать командлайны с одинарными). Запускайте из файла или из редактора.

мне как раз из файла и  нужно. но у меня не получается эту команду

Код

perl -MEncode=_utf8_on -MNet::Twitter::Search -le '$nt = new Net::Twitter::Search; 
binmode STDOUT, ":encoding(utf8)"; _utf8_on($ARGV[0]); $a = $nt->search({q => $ARGV[0]}); 
foreach my $st (@{ $a->{results} }) { print $st->{text} }' Футбол


записать в файле. точнее я не знаю как это правильно сделать. 

меня хватило только чтобы додуматься до этого:

Код

my $mt = Net::Twitter::Search->new;
  #
  my $zap='новости';
  binmode STDOUT, ":encoding(utf8)"; _utf8_on($zap);
  my $r = $mt->search({q=>$zap,since_id=>$conf[0],rpp=>100});


но оно так не работает и выдает ошибки

Это сообщение отредактировал(а) materiya - 9.6.2011, 16:23
PM MAIL   Вверх
arto
Дата 9.6.2011, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



в какой кодировке у вас строка 'новости'?
PM MAIL ICQ   Вверх
materiya
Дата 9.6.2011, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.6.2011

Репутация: нет
Всего: нет



Цитата(arto @ 9.6.2011,  16:29)
в какой кодировке у вас строка 'новости'?

подозреваю что в 1251
PM MAIL   Вверх
arto
Дата 9.6.2011, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



отличный ответ от разработчика! smile

переведите его в utf8, perldoc Encode.
либо вбейте его сразу в utf8, perldoc utf8
PM MAIL ICQ   Вверх
materiya
Дата 9.6.2011, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.6.2011

Репутация: нет
Всего: нет



Цитата(arto @ 9.6.2011,  17:02)


переведите его в utf8, perldoc Encode.
либо вбейте его сразу в utf8, perldoc utf8

блиииииииииииииииииин. вообще оказалось элементарно. нужно было всего навсего добавит прагму utf8 

Код

use utf8;
my $r = $mt->search({q=>'новости',since_id=>$conf[0],rpp=>100});
no utf8;



большое спасибо всем. в особенности, ARTO. очень помогли
PM MAIL   Вверх
ky0x5a
Дата 16.10.2011, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 17.5.2011

Репутация: нет
Всего: нет



У меня похожа проблема возникла при самом твитинге. В кокою бы я кодировку не переводил бы данные, на твитере получается абра-кодабра. Предварительно перед тем как сделать $o->update использовал Text::Iconv, Encode::from_to (с ним вообще ошибки иногда), но вот если я делаю пост таким образом $o->update("\x{410}\x{NNN}"); в этом случаи работает и на твите нормальная кирилица. При включении прагмы utf8 у меня ошибки типа:

Malformed UTF-8 character (unexpected non-continuation byte 0xd2, immediately after start byte 0xcf) at tvitter.pl line 98.
Malformed UTF-8 character (unexpected non-continuation byte 0xcc, immediately after start byte 0xd2) at tvitter.pl line 98.
Malformed UTF-8 character (unexpected non-continuation byte 0xcf, immediately after start byte 0xcc) at tvitter.pl line 98.


Как мне решить мои проблемы, ибо уже второй день не выходит!

ps: Локаль у меня koi8-r/linux, данные тоже в файле в koi8-r

PM MAIL   Вверх
ky0x5a
Дата 16.10.2011, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 17.5.2011

Репутация: нет
Всего: нет



Вот кусок кода

Код

#print "$r->{created_at}\n  $r->{user}{screen_name} => $resl\n";
my $obj = Text::Iconv->new("koi8-r", "utf8");
my $str = $obj->convert($keys{$k}[0]);
utf8::upgrade($str);        
my $msg = "\@$r->{user}{screen_name} $str";
print "$msg";    
$nt->update({status => $msg});


Может дело в самом Net::Twitter-e ???

Вот как выглядит в твите : user posted image


Это сообщение отредактировал(а) ky0x5a - 16.10.2011, 19:23
PM MAIL   Вверх
ky0x5a
Дата 16.10.2011, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 17.5.2011

Репутация: нет
Всего: нет



Посмотрев форум, а именно  utf2win написал сие функцию для перевода koi8r в utf8, тер на твитере все норма отображается.

Коды символов

Код

sub str2utf
{
    my ( $str, $newstr ) = shift;
    my %koi =
    (
        225 => "\x{410}", 226 => "\x{411}", 247 => "\x{412}", 231 => "\x{413}", 228 => "\x{414}",
        229 => "\x{415}", 179 => "\x{401}", 246 => "\x{416}", 250 => "\x{417}", 233 => "\x{418}",
        234 => "\x{419}", 235 => "\x{41A}", 236 => "\x{41B}", 237 => "\x{41C}", 238 => "\x{41D}",
        239 => "\x{41E}", 240 => "\x{41F}", 242 => "\x{420}", 243 => "\x{421}", 244 => "\x{422}",
        245 => "\x{423}", 230 => "\x{424}", 232 => "\x{425}", 227 => "\x{426}", 254 => "\x{427}",
        251 => "\x{428}", 253 => "\x{429}", 255 => "\x{42A}", 249 => "\x{42B}", 248 => "\x{42C}",
        252 => "\x{42D}", 224 => "\x{42E}", 241 => "\x{42F}", 193 => "\x{430}", 194 => "\x{431}",
        215 => "\x{432}", 199 => "\x{433}", 196 => "\x{434}", 197 => "\x{435}", 163 => "\x{451}",
        214 => "\x{436}", 218 => "\x{437}", 201 => "\x{438}", 202 => "\x{439}", 203 => "\x{43A}",
        204 => "\x{43B}", 205 => "\x{43C}", 206 => "\x{43D}", 207 => "\x{43E}", 208 => "\x{43F}",
        210 => "\x{440}", 211 => "\x{441}", 212 => "\x{442}", 213 => "\x{443}", 198 => "\x{444}",
        200 => "\x{445}", 195 => "\x{446}", 222 => "\x{447}", 219 => "\x{448}", 221 => "\x{449}",
        223 => "\x{44A}", 217 => "\x{44B}", 216 => "\x{44C}", 220 => "\x{44D}", 192 => "\x{44E}",
        209 => "\x{44F}"
    );
    
    foreach my $w ( split //, $str )
    {
        my $dec = ord($w);
        if( $koi{$dec} ) { $newstr .= $koi{$dec}; }
        else { $newstr .= $w; }
    }
    return $newstr;
}

PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1488 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.