メモ

主にプログラミング系の備忘録

ユーザIDからユーザ名などを取得する関数

現在のtwitterの仕様で機能する関数
仕様が変わったら動かなくなるはず。

Attribute VB_Name = "f_getTwitterStats"
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If


'Twitter関連の関数
'TwitterID からフォロワー数とユーザ名を取得する関数を取り合えず準備。
'Twitter側の仕様変更次第では関数自体使えなくなります。
'外部サイトのieViewとieCheckを関数内に記述し、遅延バインディングで書く

Public Function getTwitterStats(sTwitterID As String) As String

  'TwitterアカウントのTweet数、Following数、Followers数をカンマ区切りで列挙する関数
  '3つじゃない場合は想定外なので追って実装
  '存在しない場合は空文字を返す(IsNull/IsEmptyでは検出できない模様。 = "" だとTrueになる
  '16/8/31 数字の意味も追記した
  
  Dim objIE As Object
  Dim buf As String
  Dim i As Long
  Dim objtag As Object
  
  Set objIE = CreateObject("InternetExplorer.Application")

  buf = ""
    
'  Call ieView(objIE, "https://mobile.twitter.com/" & sTwitterID, False) http://www.vba-ie.net/code/ieview2.html
  'Stop
  With objIE
    .Visible = False
    .navigate "https://mobile.twitter.com/" & sTwitterID
  End With
  
  'ieCheck http://www.vba-ie.net/code/iecheck.html
  Dim timeOut As Date

  '完全にページが表示されるまで待機する
  timeOut = Now + TimeSerial(0, 0, 20)

  Do While objIE.Busy = True Or objIE.ReadyState <> 4
    DoEvents
    Sleep 1
    If Now > timeOut Then
      objIE.Refresh
      timeOut = Now + TimeSerial(0, 0, 20)
    End If
  Loop

  timeOut = Now + TimeSerial(0, 0, 20)

  Do While objIE.document.ReadyState <> "complete"
    DoEvents
    Sleep 1
    If Now > timeOut Then
      objIE.Refresh
      timeOut = Now + TimeSerial(0, 0, 20)
    End If
   Loop
  
'//ieCheck
'//ieView
  '氏名も取得する
  On Error Resume Next '実在しないIDの場合はエラーになるので処理をスキップ
  buf = objIE.document.getElementsByClassName("fullname")(0).innerText
  On Error GoTo 0
  For Each objtag In objIE.document.getElementsByTagName("div")
    If objtag.className = "statnum" Then
      If buf <> "" Then buf = buf & ","
      buf = buf & objIE.document.getElementsByTagName("div")(i + 1).innerText & ":" & CLng(objtag.innerText)

    End If
    i = i + 1
  Next
  objIE.Quit
  getTwitterStats = buf

End Function


Public Function getTwitterFollowers(sTwitterID As String) As Long
  '16/08/31 getTwitterStats から フォロワー数だけを取得する
  '「フォロワー」のキーワードを取得できなかった場合は0
  '何らかのエラーで取得できなかった場合は負のエラー番号を返す
  On Error GoTo Err_Trap
  Dim buf As String
  Dim buf2 As Variant
  buf = getTwitterStats(sTwitterID)
  If buf = "" Then Exit Function
  For Each buf2 In Split(buf, ",")
    If buf2 Like "フォロワー:*" Then
      getTwitterFollowers = Split(buf2, ":")(1)
      Exit Function
    End If
  Next buf2
  getTwitterFollowers = 0
  Exit Function
Err_Trap:
  getTwitterFollowers = -Err.Number
End Function

Public Function getTwitterFullName(sTwitterID As String) As String
  '16/08/31 TwitterID から ユーザ名を取得する
  'ユーザ名もgetTwitterStatsで取得できるようにしたのでそこから持ってくる
  getTwitterFullName = Split(getTwitterStats(sTwitterID), ",")(0)
End Function