Мы предлагаем:У нас есть:
1 базу данных MySQL(50MB)PHP 5
Прикрепление своих доменовMySQL
Предустановленные движки сайтовPerl
Место под файлы(300MB)Ruby
Бесплатно и без рекламы!
Авторизация:
e-mail: Пароль:
Забыли пароль?    Запомнить  
Все блогиПрограммирование → Слежение за друзьями
Rss

Недавно пришлось решить интересную задачу: необходимо следить кто добавляется/удаляется в друзья у определенного контакта во всем известной социальной сети. Есть облегчающие факторы – список друзей открыт, но только для друзей. Алгоритм программы простой – сохранить список контактов в файле и затем сравнить его с реальным списком друзей, об изменениях написать. Язык был выбран – Ruby.


#Подключаем необходимые библиотеки
require 'net/http'
require 'uri'
#
#Определяем переменные
#Кука для авторизации. Все современные браузеры позволяют смотреть cookie
#Необходимо найти куку с именем remixsid и подставить ее значение сюда.
remixsid='907ee5d04838e757568aacd37bab1a2372b820ed04f4235980f2a8b9bde7'
#Идентификаторы пользователей за которыми следить
user_ids={'345345345'=>'Sasha','6456546'=>'Olya','75675675'=>'Petya'}
#
#Имена файлов, куда сохранять
file_change_log_name_end="changes_log.txt"
file_friend_store_end="saved_friend_list.txt"
#
#Приступим... Создадим итератор по всем id'ам пользователей
user_ids.keys.each do |user_id|
  file_change_log_name="#{user_id}(#{user_ids[user_id]})_#{file_change_log_name_end}"
  file_friend_store="#{user_id}(#{user_ids[user_id]})_#{file_friend_store_end}"
  http = Net::HTTP.new('vk.com',80)
  #Было выявлено, что для получения списка друзей используется скрипт:
  path = '/al_friends.php'
  #Куда передаются такие параметры
  data = "act=load_friends_silent&al=1&gid=0&id=#{user_id}"
  #И должна быть установлена кука для авторизации
  headers = {'Cookie' => "remixsid=#{remixsid}"}
  #
  #Пошлем POST-запрос на сервер
  resp, data = http.post(path, data, headers)
  #
  print "#{user_id.to_s} - #{user_ids[user_id]}"
  #Распарсим полученные данные, нас интересует только id и ФИО
  friends=data.scan(/\['(\d+)','.+?','.*?','.*?','(.+?)','\d+','\d+','\d+',.+?\]/).map{|id,fio| 
    "#{fio} [http://vk.com/id#{id}]\n"
  }
  #Напечатаем текущее количество друзей
  print "\nNew size="+friends.size.to_s
  #
  #Прочитаем старый список друзей в массив
  old_list = Array.new
  if File.exists?(file_friend_store)
    File.open(file_friend_store,'r+').each{|line|old_list += [line]} 
  end
  print "\nOld size="+old_list.size.to_s
  #
  #Найдем разницу между этими списками
  diff=old_list-friends
  diff+=friends-old_list
  diff=diff.compact.uniq
  #Если в массиве с разницей элементов больше 0, то...
  if diff.size>0
    #Печатаем количество изменений и добавим в начало файла лога запись об изменениях с датой
    #Для этого прочитаем старый файл
    print "\nChanges detected: "+diff.size.to_s
    if File.exists?(file_change_log_name)
      old_data = File.open(file_change_log_name,'r').read 
      old_data.gsub!(/Last upd:.+?\n/,"")
    end
    #Запишем в лог кто добавился\удалился
    File.open(file_change_log_name,'w') do |file|
      file.write("Last upd: "+Time.now.strftime("%d.%m.%Y %H:%M:%S")+"\n")
      file.write(Time.now.strftime("%d.%m.%Y %H:%M:%S")+"\n")
      diff.each do |u| 
        file.write("	- Del #{u}") if old_list.include?(u)
        file.write("	+ Add #{u}") if friends.include?(u)
      end
      #И в конец старые данные, чтоб видеть хронологию
      file.write(old_data)
    end
  else
    #Если же массив с разницей пустой
    print "\n\tNo changes"
    #То обновим в файле лога дату последней проверки
    if File.exists?(file_change_log_name)
      File.open(file_change_log_name,'r+').write("Last upd: "+Time.now.strftime("%d.%m.%Y %H:%M:%S")) 
    end
  end
  #И сохраним актуальный сисок друзей, для следующей проверки
  File.open(file_friend_store,'w').write(friends)
  print "\n\n" if user_ids.keys.last != user_id
end

Итогом будет лог вида:

Last upd: 04.04.2011 23:25:46
03.04.2011 21:09:14
+ Add Анечка Пупкина [http://vk.com/id111111]
02.04.2011 01:02:42
+ Add Саша Пупкин [http://vk.com/id222222]
- Del Гоша Птичкин [http://vk.com/id33333]

Вверху дата и время последней проверки, и далее по датам(запуск скрипта) отображение изменений.

P.S. Теперь у тега <code>(bc.) подсвечивается синтаксис. Язык определяется автоматически.


Автор: Денис | Дата создания: 04 апреля 2011, 19:15 UTC | 0.96


Комментарии(1)
fanat100500_4325  25 января 2012, 08:37 UTC  #
0.0
392

Интересно.


Простите, Ваш браузер не поддерживает html5
Управление стрелками. Пробел - пауза.