2014-02-28 56 views
0

我使用的代码,我在这里找到从www.imdb.com获得电影标题,它工作正常,但由于imdb有某种地理位置我需要计算如何强制英文结果与一个“Accept-Language:en”标题,但我不确定是否可以使用此代码。可能吗?InternetOpenUrl和IMDB头

uses 
    WinInet, 
    StrUtils, 
    SysUtils; 

function GetHTMLTitle(const Url:string):string; 
    const 
    BuffSize  = 64*1024; 
    TitleTagBegin='<title>'; 
    TitleTagEnd ='</title>'; 
    var 
     hInter : HINTERNET; 
     UrlHandle: HINTERNET; 
     BytesRead: Cardinal; 
     Buffer : Pointer; 
     i,f  : Integer; 
    begin 
     Result:=''; 
     hInter := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); 
     if Assigned(hInter) then 
     begin 
     GetMem(Buffer,BuffSize); 
     try 
      UrlHandle := InternetOpenUrl(hInter, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD,0); 
      try 
      if Assigned(UrlHandle) then 
      begin 
       InternetReadFile(UrlHandle, Buffer, BuffSize, BytesRead); 
       if BytesRead>0 then 
       begin 
       SetString(Result, PAnsiChar(Buffer), BytesRead); 
       i:=Pos(TitleTagBegin,Result); 
       if i>0 then 
       begin 
        f:=PosEx(TitleTagEnd,Result,i+Length(TitleTagBegin)); 
        Result:=Copy(Result,i+Length(TitleTagBegin),f-i-Length(TitleTagBegin)); 
       end; 
       end; 
      end; 
      finally 
      InternetCloseHandle(UrlHandle); 
      end; 
     finally 
      FreeMem(Buffer); 
     end; 
     InternetCloseHandle(hInter); 
     end 
    end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Title : string; 
begin 
    Title := GetHTMLTitle('http://www.imdb.com/title/tt1490017/'); 
    Label1.Caption := Copy(Title, 1, LastDelimiter(')', Title)); 
end; 

回答

1

InternetOpenUrl()第三个参数允许您指定自定义标题,例如:

UrlHandle := InternetOpenUrl(hInter, PChar(Url), 'Accept-Language: en', -1, INTERNET_FLAG_RELOAD,0); 

顺便说一句,有没有保证InternetReadFile()将在一个缓冲区返回的一切。您应该在循环中调用它,将每个缓冲区附加到本地缓存,直到您缓存了所需的所有内容,然后根据需要处理缓存。

更新:IMDB确实使用IP地理定位,那么显然它不使用Accept-Language像以前那样。你必须根据调整的HTTP请求:

Why am I seeing titles in a different language than before?

我们最近修改的标题显示在网站上的方式。用户现在将默认看到在其国家/地区使用的发布语言中列出的标题(即,美国用户将看到用于北美版本的标题下列出的电影,而从法国浏览网站的用户将看到他们出现的标题关于这些电影的法语版本等) 如果您在IMDb.com上注册,并且您更喜欢在默认情况下查看原始标题或任何其他语言/发行国家/地区的标题,则可以相应地设置您的用户偏好。

要做到这一点,请点击'您的帐户'链接(位于IMDb.com每页的右上角),然后点击'网站偏好设置'选项,或直接转到https://secure.imdb.com/register-imdb/siteprefs,然后从“标题显示国家”和“标题显示语言”下拉菜单中选择所需的选项。点击“确定”保存您的选择。

如需更多帮助/信息,请参阅我们的网站偏好帮助页面。

也请记住,如果您通过以下网址访问该网站,你会经常看到在他们的原创游戏上市,无论你的登录状态或网站的喜好电影:

http://akas.imdb.com

+0

嗯, - 1作为标题长度给我错误“常量表达式违反子范围边界”即使您的建议似乎是正确的根据http://msdn.microsoft.com/en-us/library/windows/desktop/aa385098%28v=vs.85% 29.aspx – Deathglider1

+1

'DWORD'类型的值不能是负数,因此它不能是-1。尽管该文档提到了“-1L”,它的值是-1,所谓的长后缀。我相信它可以在Delphi中翻译为'DWORD(LongInt(-1))'。 – TLama

+0

我尝试过使用indy的TidHttp组件,它似乎并不像imdb.com那样关心我是否发送Accept-language:en作为标头。仍以本地语言获得标题.. IP地理定位? – Deathglider1