2014-02-28 60 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