2016-03-26 25 views
7

マシンに固定され、簡単に入手できる(クロスプラットフォーム)スクリプトの一意の文字列/数字として使用できるものを見つけることを試みています。私は、マシンにはネットワークカードがあると思います。私はそれが本当にユニークである必要はありませんが、必要なのは長期的かつ可能な限り稀に修正する必要があるということです。マシンの固定識別子(uuid.getnode)

私はMACを変更することができますし、私はおそらく私のスクリプトでそれについて警告するだろう知っているが、私は毎朝MACを変更する誰も期待していない。我々は、ランダムな48ビットの数

がい選ぶ

ハードウェアアドレスを取得するすべての試みが失敗した場合、:

私が思い付いたことuuid.getnode()ですが、docsにありつまり、関数呼び出しごとに別の乱数が得られます。したがって、MACが入手できない場合は使用できません。

...複数のネットワークインターフェイスを持つマシンでは、いずれか1つのMACアドレスが返されることがあります。

この文はgetnode()は、利用可能なすべてからランダム(または最初の)MACを取得するということですか? MAC Aを最初に実行し、MAC Bを次回に取得するとどうなりますか?固定リスト(ソート、連結、tadaaa!)を取得すれば問題ありません。

私は自分自身でテストする方法がないので、私は尋ねています。

答えて

2

私はAndroidデバイスの最初の部分をテストすることができました。新しいPythonの実行ごとに乱数を作成したので、この目的では使用できません。

2番目の問題は、ドキュメント内でany one of themを返す可能性があると言えば、頼りになるものではありません(+私はそれをテストできるマシンを見つけることができませんでした)。私はむしろ、MACを使用してあきらめましたが同じようなことに

netifaces.interfaces() # returns e.g. ['lo', 'eth0', 'tun2'] 

netifaces.ifaddresses('eth0')[netifaces.AF_LINK] 
# returns [{'addr': '08:00:27:50:f2:51', 'broadcast': 'ff:ff:ff:ff:ff:ff'}] 

をして救うために来たnetifaces素敵なパッケージには、私はむしろ、より安定した何かを得ました。

1)Windowsの場合:識別子へ今すぐ

は、このいずれかを実行し、出力を得ることは十分に良いことがあります

wmic csproduct get UUID 

か、私が使用している1レジストリ(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography)で利用可能:

import _winreg 
registry = _winreg.HKEY_LOCAL_MACHINE 
address = 'SOFTWARE\\Microsoft\\Cryptography' 
keyargs = _winreg.KEY_READ | _winreg.KEY_WOW64_64KEY 
key = _winreg.OpenKey(registry, address, 0, keyargs) 
value = _winreg.QueryValueEx(key, 'MachineGuid') 
_winreg.CloseKey(key) 
unique = value[0] 

2)Linuxの場合:

/sys/class/dmi/id/board_serial 

または

/sys/class/dmi/id/product_uuid 

かそうでない場合はルート:

cat /var/lib/dbus/machine-id 

3)アンドロイド:

あなたは、Pythonで作業していると、これはかなり良い動作するはずです、Javaのものを台無しにしたくない場合は、次の

import subprocess 
cmd = ['getprop', 'ril.serialnumber'] 
self.unique = subprocess.check_output(cmd)[:-1] 

それでもANDROID_IDのユニークさがかなりあるが、Javaのようなあなたは、その後、this answerのために行く場合議論の余地がある場合は変更することができます。したがって、シリアル番号は最も安全な賭けです。

既にリンクされた回答で言及されているように、ril.serialnumberでもnull /空または存在しない(キーがない)ことがあります。公式のAndroid APIでも同じことが起こります。

ハードウェアのシリアル番号(該当する場合)。

マック/ iPhone: 私はこれらのいずれかへのアクセスを持っていないとして、私は任意の解決策を見つけることができませんでしたが、マシンIDの値を保持する変数がある場合、その後、あなたがする必要がありますマック/ iphoneコマンドの下に試すことができるため、簡単なsubprocess.check_output()

+0

私はこのコードでアンドロイドUUIDを取得することができません。私はAndroidのmarshmallowを使用していて、端末エミュレータをインストールしています。 'getprop'の完全なリストを見ることができますが、' ril.serialnumber'は存在しません。 root権限が必要ですか? – Gahan

+0

@Gahanなぜ[このコメント](https://stackoverflow.com/questions/27368423/how-can-i-get-a-ril-serial-number-for-motorola-moto-x#comment43189061_27368423)をご覧くださいそれは馬鹿げている。むしろ残念ですが、すべてのメソッドで固有のデバイス識別子を取得するには、「バックアップ計画」が必要です。つまり、ファイル/文字列をハッシュ関数などにスローする必要があります。 [Kivy](http://kivy.org/)を使用している場合、[pyjnius](https://github.com/kivy/pyjnius/)で直接Android APIにアクセスできます(JNIが必要です)。 – KeyWeeUsr

+0

私はkivyを使用していません。しかし、私はすべてのそれをuuid、os、sys、サブプロセスなどと一緒に付属しているデフォルトのモジュールを使用するPythonを持っています他のモジュールは、私が使用している既存のクロスコンパイルのために利用できません。 – Gahan

0

とそこに取得することができ:

import subprocess 
subprocess.check_output("ioreg -rd1 -c IOPlatformExpertDevice | grep -E '(UUID)'", shell=True).split('"')[-2] # for me i got it on list value -2 if having any trouble try getting it with any alternative list element.