Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Stopped working #6

Open
kristianolofsson opened this issue Jan 12, 2017 · 14 comments
Open

Stopped working #6

kristianolofsson opened this issue Jan 12, 2017 · 14 comments

Comments

@kristianolofsson
Copy link

Trying to use the find my iPhone class but gets error about multiple slashes. What's wrong?

@beinnlora
Copy link
Contributor

probably the same as issue #4
see changes in code in #5

We'll need more detail than that - what OS? What PHP version? What's the error message exactly (copy and paste here)? What code are you using to call the class?

@kristianolofsson
Copy link
Author

Using osx and php version 5.6.27

In using a big set of code but even using your simple code from read me to print devices provides the error.

This did work last week.

@beinnlora
Copy link
Contributor

beinnlora commented Jan 12, 2017

We will still need to see the error message to help you.
You need to overwrite your class.findmyiphone.php with the patched version in #5.

@kristianolofsson Can you create a file called "test.php" with the simple contents below (replace with your icloud username and password), then copy and paste the output

<?php
    include ("class.findmyiphone.php");
    $fmi = new FindMyiPhone("icloud_username", "icloud_password", true);
    $fmi->printDevices();
?>

@jeffersonblizz
Copy link

Hi I use this part of the q code changed as follows

If (isset ($ headers ['X-Apple-MMe-Host'])) {
$ This-> host = $ headers ['X-Apple-MMe-Host'];
$ This-> scope = $ headers ['X-Apple-MMe-Scope'];
Throw new FindMyiPhoneException (true);
}
I would change what there in this code?

Follow the link to my complete code http://pastebin.com/FhHQKJF0

@beinnlora
Copy link
Contributor

@Halyspectro you posted this question already in #5. See #5 for an answer.

@jeffersonblizz
Copy link

Sorry, thank you !!!

@odelma
Copy link

odelma commented Jan 13, 2017

Hmm, cannot seem to get it working with the proposed changes. The simple printDevices with debug=TRUE actually prints everything (without debug=TRUE just gives the errors) but with these errors:

Notice: Undefined offset: 1 in /home/pi/scripts/class.findmyiphone.php on line 260
Notice: Undefined offset: 1 in /home/pi/scripts/class.findmyiphone.php on line 260
Notice: Undefined variable: request in /home/pi/scripts/class.findmyiphone.php on line 246
* getaddrinfo(3) failed for fmipmobile.icould.com:443
* Couldn't resolve host 'fmipmobile.icould.com'
* Closing connection #0

246: $arrHeaders["Content-Length"] = strlen($request);
260: list ($key, $value) = explode(': ', $line);

there should not be any modifications other than those on the pull request. Funny thing is that in Domoticz the presence detection script is working fine with:
curl -s -X POST -L -u '" .. credentials.username .. ":" .. credentials.password .. "' -H 'Content-Type: application/json; charset=utf-8' -H 'X-Apple-Find-Api-Ver: 2.0' -H 'X-Apple-Authscheme: UserIdGuest' -H 'X-Apple-Realm-Support: 1.0' -H 'User-agent: Find iPhone/1.3 MeKit (iPad: iPhone OS/4.2.1)' -H 'X-Client-Name: iPad' -H 'X-Client-UUID: 0cf3dc501ff812adb0b202baed4f37274b210853' -H 'Accept-Language: en-us' -H 'Connection: keep-alive' https://fmipmobile.icloud.com/fmipservice/device/" .. credentials.username .."/initClient"

I noticed the headers are a bit different but that should not matter as these here work for you? Any ideas what could be wrong?

edit: without debug and php error_reporting = 0 it gives:

* additional stuff not fine transfer.c:1037: 0 0
* additional stuff not fine transfer.c:1037: 0 0
* HTTP 1.1 or later with persistent connection, pipelining supported
* Connection #0 to host fmipmobile.icloud.com left intact
* Closing connection #0
* getaddrinfo(3) failed for fmipmobile.icould.com:443
* Couldn't resolve host 'fmipmobile.icould.com'
* Closing connection #0

@beinnlora
Copy link
Contributor

beinnlora commented Jan 13, 2017

typo in your header
fmipmobile.icould.com
should be
fmipmobile.icloud.com

looks like you've replaced the header manually, with a typo in some places and not others.

The code can be tidied up somewhat now there is no need to insert a custom endpoint url each call/ The URL is static. This would prevent such errors.

@odelma
Copy link

odelma commented Jan 13, 2017

Guess this means I'm pretty tired (that is what I suspected but just couldn't see it)... 😄
Strangest thing is that I thought I changed it on the first instance only and then just copied. Somehow the authentication was still correct. Well, maybe I changed it separately first.

Thanks!

@jeffersonblizz
Copy link

jeffersonblizz commented Jan 13, 2017

@beinnlora
Hi, there are errors in this snippet of my code.
On line 140. It says 1 parameter is missing to use sprintf, before putting $ this-> scope and now what to put?

Warning: sprintf(): Too few arguments in FindMyiPhone.php on line 129

CURLOPT_URL => sprintf ("https: //% s / fmipservice / device /% s /% s", $ this-> host, $ method),
Follow the code link after the changes proposed by you http://pastebin.com/7eCWBawi

@beinnlora
Copy link
Contributor

beinnlora commented Jan 13, 2017

@Halyspectro this is not an issue with the library, but a general PHP coding issue. I don't think this is the best place to support you in fixing your code, but I will try.

You need to understand the error message and interpret its use in your code.
Here, the "%s" inside the quotes will be substituted with the values of the variables ('Arguments') outside the quotes.
See this explanation:
http://www.w3schools.com/php/func_string_sprintf.asp

You have three %s inside the quotes,
https: //% s / fmipservice / device /% s /% s

and just two variables/arguments outside the quotes:
$ this-> host and $ method

hence the error message saying 'too few arguments'

The old Apple iCloud service was accessed from a URL like
"https://Apple_MMe_Host/fmipservice/device/Apple_MMe_Scope/playSound";
where the values for MMe_host and MME_Scope needed to be replaced with whatever Apple sent you when you first authenticated/logged in.

The new Apple iCloud service URL looks like this:
"https://fmipmobile.icloud.com/fmipservice/device/[email protected]/playSound"

You can see it doesn't need MMe_Host and MMe_scope any longer, but does need your Apple username.

You therefore need to change any CURLOPT_URL in your code to create a URL in the new format.

For flexibility in case the url changes again, we can define the HOST in a variable (the "fmipmobile.icloud.com" bit of the address) - also to save us typing it out each time and making mistakes.

The whole URL for triggering an event, e.g. "playSound" is something like:
"https://fmipmobile.icloud.com/fmipservice/device/[email protected]/playSound"
which you would make up from your variables:
http:// $this->host /fmipservice/device/ $username $method

Therefore in your code we need to make THREE substitutions in your url - to insert the HOST, USERNAME and METHOD in the right places.

so each CURLOPT_URL should look a little like this:
CURLOPT_URL => sprintf ("https://%s/fmipservice/device/%s/%s", $this->host, $username, $method),

each %s inside the quotation marks is replaced in turn with the three variables you define outside the quotation marks.

Any further questions I would ask you to please raise on a general PHP discussion forum, as it is not really an issue with the library. Try stackexchange.com

good luck

@kristianolofsson
Copy link
Author

kristianolofsson commented Jan 14, 2017 via email

@beinnlora
Copy link
Contributor

@kristianolofsson public function printDevices() still exists... No functions have been removed from the library in the latest commit (Jan 2016)... unless some element of the API has changed that we have no control over..

@jeffersonblizz
Copy link

jeffersonblizz commented Jan 15, 2017

@beinnlora @albeebe
I found out what was happening that I could not verify if my page took the value or not of the Exception I'm a little lay in php but I'm good in java and I managed to debug my code to check the value of my variables.
My focus on using FindMyIphone.php is just checking if the apple id is real.
Okay, let's go there before the update I would do the following to return true to my page that was requesting the class IMF I would do an if that way

If (isset ($ headers ['X-Apple-MMe-Host'])) { $ This-> host = $ headers ['X-Apple-MMe-Host']; $ This-> scope = $ headers ['X-Apple-MMe-Scope']; Throw new FindMyiPhoneException (true); } Else { Throw new FindMyiPhoneException (false); }

And I took this value this way and then I saw that it was a real apple id.
If ($ e-> getMessage () == true) { Header ("Location: ./map/index.php"); } Else { Header ('Location:'. $ _ SERVER ['HTTP_REFERER']. '? Error = error'); }
But now there's no way to check with these headers anybody has any idea which of the $ headers I use now to check if it's a valid id? I know I already seem to be bothering but the lack of experience and documentation on the api I have only recourse to you, if someone has some page for me to study more about the api and to be able to send please I would be grateful.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants