2010-11-02 17 views
3

Cela peut être trivial ou pas, mais je travaille sur un logiciel qui va vérifier le domaine "fin de ligne" pour les annonces affichées grâce à mon application web. Idéalement, j'ai une liste de domaines dont je ne veux pas diffuser d'annonces (disons que Norton.com en fait partie), mais la plupart des réseaux publicitaires diffusent des annonces via des URL raccourcies et cryptiques (adsrv.com), qui redirigent finalement vers Norton.com. La question est donc: est-ce que quelqu'un a construit, ou a une idée de comment construire, un outil semblable à un grattoir qui retournera l'URL de destination finale d'une annonce.Comment trouver la destination finale (url) d'une annonce (par programme)

Découverte initiale: Certaines annonces sont en Flash, JavaScript ou HTML. Émuler un navigateur est parfaitement viable et combattrait différents formats d'annonces. Toutes les annonces Flash ou JS n'ont pas d'alternative noflash ou noscript. (Navigateur peut être nécessaire, mais comme indiqué cela est parfaitement bien ... Utilisation de quelque chose comme WatiN ou WatiR ou WatiJ ou Selenium, etc ...)

Préférez open source afin que je puisse reconstruire moi-même. Vraiment apprécier l'aide!

EDIT * Ce script doit cliquer sur l'annonce, car il peut s'agir de Flash, de JS ou simplement de HTML. Donc Curl est moins une option, à moins que Curl puisse cliquer? CURL peut récupérer les en-têtes HTTP.

Répondre

0

Continuez à avancer dans la chaîne jusqu'à ce que vous n'obteniez plus d'en-têtes Location: et que le dernier en-tête Location: que vous avez reçu constitue l'URL finale.

2
curl --head -L -s -o /dev/null -w %{url_effective} <some-short-url> 
  • --head restreint à des requêtes HEAD seulement, de sorte que vous ne devez pas réellement télécharger les pages

  • -L dit curl pour continuer à suivre réoriente

  • -s se débarrasse de tous les mètres de progrès, etc

  • -o /dev/null dit boucle de jeter les en-têtes récupérés (nous ne nous soucions pas d'eux)

  • -w %{url_effective} dit boucle d'écrire la dernière url tirée par les cheveux le résultat à stdout

Le résultat sera que l'URL efficace est écrite sur stdout, et rien d'autre.

4

implémentation PHP Exemple:

$k = curl_init('http://goo.gl'); 
curl_setopt($k, CURLOPT_FOLLOWLOCATION, true); // follow redirects 
curl_setopt($k, CURLOPT_USERAGENT, 
'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.7 ' . 
'(KHTML, like Gecko) Chrome/7.0.517.41 Safari/534.7'); // imitate chrome 
curl_setopt($k, CURLOPT_NOBODY, true); // HEAD request only (faster) 
curl_setopt($k, CURLOPT_RETURNTRANSFER, true); // don't echo results 
curl_exec($k); 
$final_url = curl_getinfo($k, CURLINFO_EFFECTIVE_URL); // get last URL followed 
curl_close($k); 
echo $final_url; 

qui doit retourner quelque chose comme https://www.google.com/accounts/ServiceLogin?service=urlshortener&continue=http://goo.gl/?authed%3D1&followup=http://goo.gl/?authed%3D1&passive=true&go=true

Remarque: Vous devrez peut-être utiliser curl_setopt() pour désactiver CURLOPT_SSL_VERIFYHOST et CURLOPT_SSL_VERIFYPEER si vous souhaitez suivre de manière fiable à travers HTTPS/SSL

+0

votre légende. solution parfaite pour moi. –

1

Vous parlez de suivre la redirection de l'URL jusqu'à ce qu'elle expire, se mette en boucle ou se résout en une fin adresse al.

La bibliothèque Net :: HTTP a un exemple Following Redirection.De plus, le module open-uri de Ruby redirigera automatiquement, donc je pense que vous pouvez lui demander l'URL de fin après avoir récupéré une page et trouver où elle a atterri.

require 'open-uri' 

io = open('http://google.com') 
body = io.read 
io.base_uri.to_s # => "http://www.google.com/" 

Notez que, après avoir lu le corps l'URL a été redirigé vers / dir Google.

Les deux cas ne traiteront que les redirections de serveur. Pour les méta-redirections, vous devrez regarder le code, voir où ils vous redirigent et y aller.

Cela vous lancer:

require 'nokogiri' 

doc = Nokogiri::HTML('<meta http-equiv="REFRESH" content="0;url=http://www.the-domain-you-want-to-redirect-to.com">') 

redirect_url = (doc%'meta[@http-equiv="REFRESH"]')['content'].split('=').last rescue nil 
0

Le joyau Mechanize est pratique pour cela:

agent = Mechanize.new {|a| a.user_agent_alias = 'Windows IE 7'} 
    page = agent.get(url) 
    final_url = page.uri.to_s 
0

La solution que je fini par utiliser simulait un navigateur, charger l'annonce, et en cliquant. Le clic était l'ingrédient clé. Les solutions proposées par d'autres étaient bonnes pour une URL donnée mais ne traitaient pas Flash, JavaScript, etc. Appréciez l'aide de tous.

Questions connexes