whatsapp-desktop
SendWhatsppTextByJavaScript
whatsapp-desktop | SendWhatsppTextByJavaScript | |
---|---|---|
4 | 282 | |
125 | 10 | |
- | - | |
0.0 | 0.0 | |
3 months ago | about 3 years ago | |
JavaScript | JavaScript | |
GNU General Public License v3.0 only | - |
Stars - the number of stars that a project has on GitHub. Growth - month over month growth in stars.
Activity is a relative number indicating how actively a project is being developed. Recent commits have higher weight than older ones.
For example, an activity of 9.0 indicates that a project is amongst the top 10% of the most actively developed projects that we are tracking.
whatsapp-desktop
-
Change title bar color
I got this custom made WA client from github: https://github.com/oOthkOo/whatsapp-desktop It works fine like the old version before the update. My only problem with it is the title bar. Anyone has an idea how to change the title bar from white to black?
- How to download most recent PC version without MS Store?
- Open source version of desktop app here
-
Disable multidevice on WA desktop
what about this client? is it secure? https://github.com/oOthkOo/whatsapp-desktop
SendWhatsppTextByJavaScript
-
Selenium WebScraper for WhatsApp to atomatically add People in Group
def __init__(self, group_name=GN): self.group_name = group_name logging.info("Starting WhatsAppGroupManager") options = webdriver.ChromeOptions() options.add_argument("user-data-dir=" + PATH_TO_CHROME_DRIVER_USER_PROFILE) self.driver = webdriver.Chrome(options=options) # self.driver.maximize_window() self.driver.get('https://web.whatsapp.com/') logging.info("Opened WhatsApp Web") def manager_kill(self): self.driver.close() self.driver.quit() def open_group_chat(self): try: # Wait for the chat input field to be visible chat_input = WebDriverWait(self.driver,45).until(EC.visibility_of_element_located( ( By.XPATH, '/html/body/div[1]/div/div[2]/div[3]/div/div[1]/div/div[2]/div[2]/div/div[1]/p') ) ) time.sleep(sleep_time) chat_input.click() Logger.info("Clicked on the chat input field on the left side of WhatsApp") time.sleep(sleep_time) # Find the input field again after clicking on it chat_input = WebDriverWait(self.driver, 45).until(EC.visibility_of_element_located( ( By.XPATH, '/html/body/div[1]/div/div[2]/div[3]/div/div[1]/div/div[2]/div[2]/div/div[1]/p') ) ) chat_input.send_keys(self.group_name) Logger.info("Inserted the group name into the search field") time.sleep(sleep_time) chat_input.send_keys(Keys.ENTER) Logger.info("Pressed ENTER") time.sleep(sleep_time) Logger.info("Opened the group chat") except Exception as e: Logger.error(f"Error: {e}") self.manager_kill() return None def open_group_info(self): try: # open group chat self.open_group_chat() time.sleep(sleep_time) chat_input = WebDriverWait(self.driver, 45).until(EC.visibility_of_element_located( ( By.XPATH, '/html/body/div[1]/div/div[2]/div[4]/div/header/div[3]/div/div[3]/div/div/span') ) ) chat_input.click() Logger.info("Clicked on the group info button") time.sleep(sleep_time) # Find the input field again after clicking on it chat_input = WebDriverWait(self.driver, 45).until(EC.visibility_of_element_located( ( By.XPATH, '/html/body/div[1]/div/span[5]/div/ul/div/div/li[1]/div') ) ) chat_input.click() Logger.info("In group info menu") time.sleep(sleep_time) except Exception as e: logging.error(f"Error in open_group_info: {e}") self.manager_kill() return None def open_add_telephone_numbers(self): self.open_group_info() time.sleep(sleep_time) try: chat_input = WebDriverWait(self.driver, 45).until(EC.visibility_of_element_located( ( By.XPATH, '/html/body/div[1]/div/div[2]/div[5]/span/div/span/div/div/div/section/div[7]/div[2]/div[1]/div[2]/div/div') ) ) chat_input.click() Logger.info("Clicked on the add telephone numbers button") time.sleep(sleep_time) except Exception as e: logging.error(f"Error in open_add_telephone_numbers: {e}") self.manager_kill() return None def add_telephone_numbers(self, phone_numbers): if isinstance(phone_numbers, str): phone_numbers = [phone_numbers] # convert string to list self.open_add_telephone_numbers() time.sleep(sleep_time) try: for phone_number in phone_numbers: try: chat_input = WebDriverWait(self.driver, 45).until(EC.visibility_of_element_located( ( By.XPATH, '/html/body/div[1]/div/span[2]/div/span/div/div/div/div/div/div/div[1]/div/div[2]/div[2]/div/div[1]/p') ) ) chat_input.click() Logger.info("Clicked on the search field") time.sleep(sleep_time) # Clear the text field chat_input.send_keys(Keys.CONTROL + 'a') chat_input.send_keys(Keys.DELETE) chat_input.send_keys(phone_number) Logger.info("Inserted the phone number into the search field") time.sleep(sleep_time) # Check if the phone number exists # Not Working try: WebDriverWait(self.driver, 2).until(EC.visibility_of_element_located( ( By.XPATH, '/html/body/div[1]/div/span[2]/div/span/div/div/div/div/div/div/div[2]/div/div/div/div[2]/div/div[2]') ) ) Logger.info("Phone Number exist") time.sleep(sleep_time) # Send the ENTER key chat_input.send_keys(Keys.ENTER) Logger.info("Pressed ENTER to add the person into the group") time.sleep(sleep_time) continue except: Logger.info(f"Phone number does not exists: {phone_number}") time.sleep(sleep_time) pass except Exception as e: logging.error(f"Error in open_add_telephone_numbers: {e}") self.manager_kill() return None # Send the ENTER key chat_input.send_keys(Keys.ENTER) Logger.info("Pressed ENTER to add the person into the group") time.sleep(sleep_time) chat_input = WebDriverWait(self.driver, 45).until(EC.visibility_of_element_located( ( By.XPATH, '/html/body/div[1]/div/span[2]/div/span/div/div/div/div/div/div/span[2]/div/div/div/span') ) ) chat_input.click() Logger.info("Clicked on the add telephone numbers button") time.sleep(sleep_time) # Confirm the adding of the telephone numbers chat_input = WebDriverWait(self.driver, 45).until(EC.element_to_be_clickable( ( By.XPATH, '/html/body/div[1]/div/span[2]/div/span/div/div/div/div/div/div[2]/div/button[2]/div/div') ) ) time.sleep(5) Logger.info("Should click on the confirmation the add telephone numbers button") chat_input.click() Logger.info("Clicked on Confirmation the add telephone numbers button") time.sleep(4) except Exception as e: logging.error(f"Error in add_telephone_numbers: {e}") self.manager_kill() return None
-
User-facing/client-side tools for internet troubleshooting
Hi everyone. The other day a client of mine's employees started having issues with the "internet not working". After some detective work with traceroute and interviewing them about what sites they were having issues with, I determined that the actual issue was with the web.whatsapp.com service having downtime. I'm mentioning all this because I'm now thinking of making them a small video/article on our intranet about how to troubleshoot problems like this by themselves. Part of that strategy is deploying WinMTR on their machines so they can run it. I still don't know how I'll verify if it's installed, but maybe checking if it's in the target folder (intend to send it to System32 by creating an Intune package with IntuneWinAppUtil.exe) is a good start. There is a Tracert app on the Appstore but it's paid and I have no idea how one can pay for it in bulk without having each employee put in a credit card. Anyways just wanted to ask what you all are doing for this type of scenarios. Cheers. PS: anyone hiring for Intune/sysadmin type jobs or know where one can find remote jobs for non-US citizens?
-
Is WhatsApp Web down in Oman?
I believe web.whatsapp.com is being blocked by local telecom companies in order to protect their duopoly and keep Oman in tech--stone-age. If fewer people know how else the rest of the world uses the internet, then they don't have to make an effort to improve their offerings. Omantel is definitely blocking this web.whatsapp.com.
-
Open Letter to WhatsApp: Need for a Linux Desktop App
What's wrong with https://web.whatsapp.com/ ?
-
Simplistic
{"nightTab":true,"version":"7.3.0","state":{"layout":{"area":{"header":{"width":74,"justify":"center"},"bookmark":{"width":100,"justify":"center"}},"alignment":"center-center","order":"header-bookmark","direction":"horizontal","size":91,"width":99,"padding":49,"gutter":49,"breakpoint":"lg","scrollbar":"none","title":"Launchpad","favicon":"https://cdn-icons-png.flaticon.com/512/7397/7397876.png","overscroll":false},"header":{"item":{"justify":"center"},"greeting":{"show":true,"type":"good","custom":"","name":"Avnes","size":146,"newLine":true},"transitional":{"show":false,"type":"time-and-date","size":100,"newLine":false},"clock":{"hour":{"show":true,"display":"number"},"minute":{"show":true,"display":"number"},"second":{"show":true,"display":"number"},"separator":{"show":true,"text":":"},"meridiem":{"show":false},"hour24":{"show":true},"size":362,"newLine":true},"date":{"day":{"show":true,"display":"word","weekStart":"monday","length":"long"},"date":{"show":true,"display":"number","ordinal":true},"month":{"show":true,"display":"word","length":"short","ordinal":true},"year":{"show":true,"display":"number"},"separator":{"show":true,"text":":"},"format":"date-month","size":121,"newLine":true},"search":{"show":true,"width":{"by":"custom","size":82},"engine":{"selected":"google","custom":{"name":"","url":"","queryName":""}},"text":{"justify":"center"},"size":86,"newLine":true,"newTab":false,"string":"partial derivative symbol"},"order":["greeting","clock","date","search"],"edit":false},"bookmark":{"size":56,"url":{"show":true},"line":{"show":true},"shadow":{"show":true},"hoverScale":{"show":true},"orientation":"bottom","style":"block","newTab":false,"edit":false,"add":false,"show":true,"item":{}},"group":{"area":{"justify":"left"},"order":"header-body","name":{"size":100},"toolbar":{"size":100},"edit":false,"add":false},"toolbar":{"location":"corner","position":"bottom-right","size":76,"accent":{"show":true},"add":{"show":true},"edit":{"show":true},"newLine":false},"theme":{"color":{"range":{"primary":{"h":218,"s":60}},"contrast":{"start":11,"end":68},"shades":14},"accent":{"hsl":{"h":270,"s":100,"l":68},"rgb":{"r":173,"g":92,"b":255},"random":{"active":false,"style":"any"},"cycle":{"active":false,"speed":300,"step":10}},"font":{"display":{"name":"Montserrat","weight":250,"style":"normal"},"ui":{"name":"Montserrat","weight":400,"style":"normal"}},"background":{"type":"image","color":{"rgb":{"r":0,"g":0,"b":0},"hsl":{"h":0,"s":0,"l":0}},"gradient":{"angle":160,"start":{"hsl":{"h":206,"s":16,"l":40},"rgb":{"r":86,"g":104,"b":118}},"end":{"hsl":{"h":219,"s":28,"l":12},"rgb":{"r":22,"g":28,"b":39}}},"image":{"url":"https://source.unsplash.com/random/1920x1080/?landscape,nature,wallpaper","blur":0,"opacity":69,"scale":100,"grayscale":0,"accent":0,"vignette":{"opacity":21,"start":100,"end":90}},"video":{"url":"","blur":0,"opacity":100,"scale":100,"grayscale":0,"accent":0,"vignette":{"opacity":0,"start":90,"end":70}}},"opacity":{"general":0},"layout":{"color":{"by":"theme","blur":6,"opacity":0,"hsl":{"h":195,"s":100,"l":55},"rgb":{"r":26,"g":198,"b":255}},"divider":{"size":0}},"header":{"color":{"by":"custom","opacity":10,"hsl":{"h":0,"s":0,"l":0},"rgb":{"r":0,"g":0,"b":0}},"search":{"opacity":34}},"bookmark":{"color":{"by":"theme","opacity":10,"hsl":{"h":0,"s":0,"l":0},"rgb":{"r":0,"g":0,"b":0}},"item":{"border":1,"opacity":50}},"group":{"toolbar":{"opacity":0}},"toolbar":{"opacity":18},"style":"dark","radius":73,"shadow":171,"shade":{"opacity":1,"blur":0},"custom":{"all":[],"edit":false}},"search":false,"modal":false,"menu":true},"bookmark":[{"name":{"text":"","show":true},"collapse":false,"toolbar":{"openAll":{"show":false},"collapse":{"show":false}},"items":[{"url":"https://web.whatsapp.com/","display":{"alignment":"bottom-left","direction":"vertical","order":"visual-name","rotate":0,"translate":{"x":0,"y":0},"gutter":25,"name":{"show":true,"text":"","size":12},"visual":{"show":true,"type":"icon","size":48,"letter":{"text":"Whatsapp"},"icon":{"name":"whatsapp","prefix":"fab","label":"What's App"},"image":{"url":""},"shadow":{"size":0}}},"accent":{"by":"custom","hsl":{"h":121,"s":99,"l":69},"rgb":{"r":98,"g":254,"b":100}},"color":{"by":"theme","hsl":{"h":0,"s":0,"l":0},"rgb":{"r":0,"g":0,"b":0},"opacity":50},"background":{"show":false,"type":"image","opacity":100,"image":{"url":""},"video":{"url":""}},"border":1,"shape":{"wide":false,"tall":false},"timestamp":1700054080534},{"url":"https://www.ahaguru.com/signin","display":{"alignment":"bottom-right","direction":"vertical","order":"visual-name","rotate":0,"translate":{"x":0,"y":0},"gutter":25,"name":{"show":true,"text":"","size":12},"visual":{"show":true,"type":"letter","size":25,"letter":{"text":"AG ©"},"icon":{"name":"","prefix":"","label":""},"image":{"url":""},"shadow":{"size":36}}},"accent":{"by":"custom","hsl":{"h":192,"s":99,"l":56},"rgb":{"r":32,"g":209,"b":254}},"color":{"by":"theme","hsl":{"h":0,"s":0,"l":0},"rgb":{"r":0,"g":0,"b":0},"opacity":50},"background":{"show":false,"type":"image","opacity":100,"image":{"url":""},"video":{"url":""}},"border":1,"shape":{"wide":false,"tall":false},"timestamp":1700054310774},{"url":"https://class.ahaguru.com/","display":{"alignment":"bottom-right","direction":"vertical","order":"visual-name","rotate":0,"translate":{"x":0,"y":0},"gutter":25,"name":{"show":true,"text":"","size":12},"visual":{"show":true,"type":"letter","size":25,"letter":{"text":"AG Ⓛ"},"icon":{"name":"500px","prefix":"fab","label":"500px"},"image":{"url":""},"shadow":{"size":34}}},"accent":{"by":"custom","hsl":{"h":176,"s":98,"l":51},"rgb":{"r":8,"g":253,"b":236}},"color":{"by":"theme","hsl":{"h":0,"s":0,"l":0},"rgb":{"r":0,"g":0,"b":0},"opacity":50},"background":{"show":false,"type":"image","opacity":100,"image":{"url":""},"video":{"url":""}},"border":1,"shape":{"wide":false,"tall":false},"timestamp":1700054253962},{"url":"https://artsexperiments.withgoogle.com/periodic-table/","display":{"alignment":"bottom-left","direction":"vertical","order":"visual-name","rotate":0,"translate":{"x":0,"y":0},"gutter":12,"name":{"show":true,"text":"","size":12},"visual":{"show":true,"type":"image","size":62,"letter":{"text":""},"icon":{"name":"","prefix":"","label":""},"image":{"url":"https://cdn-icons-png.flaticon.com/512/4535/4535867.png?ga=GA1.1.677380455.1700120484"},"shadow":{"size":0}}},"accent":{"by":"custom","hsl":{"h":322,"s":97,"l":72},"rgb":{"r":253,"g":114,"b":202}},"color":{"by":"theme","hsl":{"h":0,"s":0,"l":0},"rgb":{"r":0,"g":0,"b":0},"opacity":50},"background":{"show":false,"type":"image","opacity":100,"image":{"url":""},"video":{"url":""}},"border":1,"shape":{"wide":true,"tall":false},"timestamp":1700925270146},{"url":"https://app.raindrop.io","display":{"alignment":"bottom-center","direction":"vertical","order":"visual-name","rotate":0,"translate":{"x":0,"y":0},"gutter":25,"name":{"show":true,"text":"","size":12},"visual":{"show":true,"type":"image","size":54,"letter":{"text":""},"icon":{"name":"","prefix":"","label":""},"image":{"url":"https://miro.medium.com/v2/resize:fit:1024/1*JtxOMEcB0N7yoGiHjFf1Gg.png"},"shadow":{"size":0}}},"accent":{"by":"custom","hsl":{"h":195,"s":100,"l":61},"rgb":{"r":56,"g":205,"b":255}},"color":{"by":"theme","hsl":{"h":0,"s":0,"l":0},"rgb":{"r":0,"g":0,"b":0},"opacity":50},"background":{"show":false,"type":"image","opacity":100,"image":{"url":""},"video":{"url":""}},"border":1,"shape":{"wide":false,"tall":true},"timestamp":1700491631679},{"url":"https://desmos.com/scientific","display":{"alignment":"bottom-left","direction":"vertical","order":"visual-name","rotate":0,"translate":{"x":0,"y":0},"gutter":25,"name":{"show":true,"text":"","size":7},"visual":{"show":true,"type":"icon","size":34,"letter":{"text":""},"icon":{"name":"square-root-alt","prefix":"fas","label":"Alternate Square Root"},"image":{"url":""},"shadow":{"size":0}}},"accent":{"by":"custom","hsl":{"h":154,"s":72,"l":38},"rgb":{"r":27,"g":167,"b":106}},"color":{"by":"theme","hsl":{"h":0,"s":0,"l":0},"rgb":{"r":0,"g":0,"b":0},"opacity":50},"background":{"show":false,"type":"image","opacity":100,"image":{"url":""},"video":{"url":""}},"border":1,"shape":{"wide":true,"tall":false},"timestamp":1701435891254},{"url":"https://unsplash.com","display":{"alignment":"center-center","direction":"vertical","order":"visual-name","rotate":0,"translate":{"x":0,"y":0},"gutter":30,"name":{"show":true,"text":"","size":7},"visual":{"show":true,"type":"image","size":45,"letter":{"text":""},"icon":{"name":"","prefix":"","label":""},"image":{"url":"https://cdn.icon-icons.com/icons2/2566/PNG/512/unsplash_icon_153496.png"},"shadow":{"size":0}}},"accent":{"by":"theme","hsl":{"h":0,"s":0,"l":0},"rgb":{"r":0,"g":0,"b":0}},"color":{"by":"custom","hsl":{"h":0,"s":8,"l":85},"rgb":{"r":220,"g":214,"b":214},"opacity":50},"background":{"show":false,"type":"image","opacity":100,"image":{"url":""},"video":{"url":""}},"border":1,"shape":{"wide":false,"tall":false},"timestamp":1701421863143},{"url":"https://mail.google.com/","display":{"alignment":"bottom-right","direction":"vertical","order":"visual-name","rotate":0,"translate":{"x":0,"y":0},"gutter":25,"name":{"show":true,"text":"","size":13},"visual":{"show":true,"type":"icon","size":44,"letter":{"text":"GM"},"icon":{"name":"envelope","prefix":"fas","label":"Envelope"},"image":{"url":""},"shadow":{"size":0}}},"accent":{"by":"custom","hsl":{"h":281,"s":100,"l":64},"rgb":{"r":197,"g":71,"b":255}},"color":{"by":"theme","hsl":{"h":0,"s":0,"l":0},"rgb":{"r":0,"g":0,"b":0},"opacity":50},"background":{"show":false,"type":"image","opacity":100,"image":{"url":""},"video":{"url":""}},"border":1,"shape":{"wide":true,"tall":false},"timestamp":1626298011293},{"url":"https://doc.rust-lang.org/stable/book/","display":{"alignment":"bottom-left","direction":"vertical","order":"visual-name","rotate":0,"translate":{"x":0,"y":0},"gutter":25,"name":{"show":true,"text":"","size":12},"visual":{"show":true,"type":"image","size":90,"letter":{"text":""},"icon":{"name":"","prefix":"","label":"rust"},"image":{"url":"https://www.fpcomplete.com/wp-content/uploads/2023/04/rust-logo-512x512_white.png"},"shadow":{"size":0}}},"accent":{"by":"custom","hsl":{"h":0,"s":99,"l":69},"rgb":{"r":254,"g":98,"b":98}},"color":{"by":"theme","hsl":{"h":0,"s":0,"l":0},"rgb":{"r":0,"g":0,"b":0},"opacity":50},"background":{"show":false,"type":"image","opacity":100,"image":{"url":""},"video":{"url":""}},"border":1,"shape":{"wide":true,"tall":true},"timestamp":1700491471508},{"url":"https://netaccess.iitm.ac.in/account/login","display":{"alignment":"center-center","direction":"vertical","order":"visual-name","rotate":0,"translate":{"x":0,"y":0},"gutter":25,"name":{"show":true,"text":"","size":12},"visual":{"show":true,"type":"icon","size":36,"letter":{"text":""},"icon":{"name":"wifi","prefix":"fas","label":"WiFi"},"image":{"url":""},"shadow":{"size":46}}},"accent":{"by":"custom","hsl":{"h":220,"s":100,"l":65},"rgb":{"r":77,"g":136,"b":255}},"color":{"by":"theme","hsl":{"h":0,"s":0,"l":0},"rgb":{"r":0,"g":0,"b":0},"opacity":50},"background":{"show":false,"type":"image","opacity":100,"image":{"url":""},"video":{"url":""}},"border":1,"shape":{"wide":false,"tall":true},"timestamp":1700054179807},{"url":"https://chromewebstore.google.com/","display":{"alignment":"top-center","direction":"vertical","order":"visual-name","rotate":0,"translate":{"x":0,"y":0},"gutter":25,"name":{"show":true,"text":"","size":7},"visual":{"show":true,"type":"image","size":41,"letter":{"text":""},"icon":{"name":"","prefix":"","label":""},"image":{"url":"https://upload.wikimedia.org/wikipedia/commons/thumb/c/c5/Google_Chrome_Web_Store_icon_2015.svg/512px-Google_Chrome_Web_Store_icon_2015.svg.png?20220227092509"},"shadow":{"size":0}}},"accent":{"by":"custom","hsl":{"h":0,"s":0,"l":100},"rgb":{"r":255,"g":255,"b":255}},"color":{"by":"theme","hsl":{"h":0,"s":0,"l":0},"rgb":{"r":0,"g":0,"b":0},"opacity":50},"background":{"show":false,"type":"image","opacity":100,"image":{"url":""},"video":{"url":""}},"border":1,"shape":{"wide":false,"tall":true},"timestamp":1701422504835}]}]}
-
Best app, like, ever?
Whatsapp (Free) - chat. although some people prefer iMessage and other ones.
-
WhatsApp Mac Client - can I have it installed two times?
use browser for one account https://web.whatsapp.com/ and app for the other
-
Can a PC get infected by Malware or Virus by watching a video via WhatsApp Web?
I've received a video via WhatsApp from an untrusted source. I used my personal PC to open the video (via "WhatsApp Web" website). I should mention that I didn't download the video to my PC, I just opened the video online, watched it then closed the web browser.
-
Unable to link any devices (browser, windows app)
I have recently moved from iPhone to Pixel 8, and when I try to link a device, for example my browser (web.whatsapp.com) or the windows app, the Whatsapp App on the phone crashes and restarts, and the linking process does not succeed.
-
https://web.whatsapp.com/ --- Search is not working
on my chrome browser i have linked device https://web.whatsapp.com/ and when i select search button (magnifying glass) i type a word and i can see search is looking for messages... but the search never completes and no messages are found.
What are some alternatives?
WALC - An unofficial WhatsApp Desktop client for linux systems.
curl-impersonate - curl-impersonate: A special build of curl that can impersonate Chrome & Firefox
Ferdi - Ferdi is a free and opensource all-in-one desktop app that helps you organize how you use your favourite apps
Cobalt - Standalone unofficial fully-featured Whatsapp Web and Mobile API for Java and Kotlin
SSHAgentSecureProxy - Secure SSH Agent proxy for linux/mac desktop environment.
DNSlock-PiHole-whitelist
QB - QuickBox is much more than a ‘seedbox installer script’, it is a simplistic approach to achieving easy seedbox and services management from a beautifully designed dashboard. Allowing users the ability to interact with their seedbox and server on a professional grade level.
Ferdium - Ferdium is a desktop app that helps you organize how you use your favourite apps by combining them into one application.
snapdrop-tray - Crossplatform Snapdrop Client with functional Tray Icon, ported with Electron
watomatic - Auto reply app helping you move away from less private messengers like WhatsApp and Facebook Messenger
community-edition - Free and Open Source messaging and emailing app that combines common web applications into one.
challenge-bypass-extension - DEPRECATED - Client for Privacy Pass protocol providing unlinkable cryptographic tokens